spring類的注入和new簡單理解
springboot
1、main.run方法進入
2、refreshContext
3、refresh
4、finishBeanFactoryInitialization(完成beanFactory的初始化)
5、preInstantiateSingletons(初始化單例)
6、getBean(獲取Bean)
7、doGetBean
8、createBean
9、doCreateBean(此方法內部會createBean,建立bean即構造方法執行)
10、populateBean(進行autowired自動注入)
11、applyPropertyValues(進行屬性注入)
PS:new物件,不能導致物件依賴的注入屬性自動賦值,只有對物件進行注入,物件依賴的注入屬性才能賦值;
且注入的屬性不能在建構函式中操作,因為bean沒有建立完成,屬性也沒有注入,此時是為null的
問題:spring預設是單例模式,還有必要建立單例類嗎?
自己理解:有必要,如果不使用autowired進行自動注入,使用new操作還是可以生成多個物件,
spring的單例是針對自動注入
例子:
@Component
public class CxfClient{
@Value("${address }")
private String address;
private CxfClient(){
System.out.println(address ); //此時為null.bean沒有載入完成,屬性也沒有載入
}
public void createClient(){
System.out.println(address );//此時為配置檔案中的值
}
private static class SingletonHolder {
private static final CxfClient INSTANCE = new CxfClient();
}
public static final CxfClient getInstance() {
return SingletonHolder.INSTANCE;
}
}
public class Test{
@Autowired
private CxfClient cxfClient;
public void testClient(){
CxfClient.getInstance().createClient();//列印為null.無法注入
cxfClient.createClient();//列印為配置檔案中的值
}
}