聊一聊new對象與Spring對bean的初始化的差別
new對象與Spring對bean初始化差別
這個問題是一次我將老系統(tǒng)代碼遷移到基于Spring構建的新系統(tǒng)中時遇到的,老代碼中有很多地方使用了new方法來初始化對象,當時也沒有特別注意,最后聯(lián)調(diào)的時候發(fā)現(xiàn)所有new出來的對象中使用Autowired自動依賴注入的屬性全都拋出了NullPointerException。
什么意思呢?
@Component
Class A {
? ? ...
}?@Component
Class B {
? ? ...
}?@Component
Class C {
? ? @Autowired
? ? A a;
? ? @Autowired
? ? B b;
}?當我使用C c = new C()時,c中的a和b都是null,也就是無法完成注入。
說實話,在聯(lián)調(diào)的那一刻我有一瞬間是懵逼的,但現(xiàn)在回想起來,哦,真是太傻了。
簡單來理解
Spring首先會通過new方法創(chuàng)建一個對象,然后去完成屬性的填充,而這種填充在我們外界看來是“自動”的;而我們直接通過new方法創(chuàng)建對象時,是沒有誰去完成屬性的填充的,因而內(nèi)部屬性值全為null。
Spring類的注入和new簡單理解
springboot
main.run方法進入refreshContextrefreshfinishBeanFactoryInitialization(完成beanFactory的初始化)preInstantiateSingletons(初始化單例)getBean(獲取Bean)doGetBeancreateBeandoCreateBean(此方法內(nèi)部會createBean,創(chuàng)建bean即構造方法執(zhí)行)populateBean(進行autowired自動注入)applyPropertyValues(進行屬性注入)
PS:new對象,不能導致對象依賴的注入屬性自動賦值,只有對對象進行注入,對象依賴的注入屬性才能賦值;
且注入的屬性不能在構造函數(shù)中操作,因為bean沒有創(chuàng)建完成,屬性也沒有注入,此時是為null的
問題:spring默認是單例模式,還有必要創(chuàng)建單例類嗎?
自己理解:有必要,如果不使用autowired進行自動注入,使用new操作還是可以生成多個對象,
spring的單例是針對自動注入
例子:
? ? ?@Component
? ? ?public class CxfClient{undefined
? ? ? ? ? @Value("${address }")
? ? ? ? ? private String address;
? ? ? ? ? private CxfClient(){undefined
? ? ? ? ? ? ? ?System.out.println(address ); //此時為null.bean沒有加載完成,屬性也沒有加載
? ? ? ? ? }
? ? ? ? ? public void createClient(){undefined
? ? ? ? ? ? ? ?System.out.println(address );//此時為配置文件中的值
? ? ? ? ? }
? ? ? ? ? private static class SingletonHolder {undefined
? ? ? ? ? ? ? private static final CxfClient INSTANCE = new CxfClient();
? ? ? ? ? }
? ? ? ? ? public static final CxfClient getInstance() {undefined
? ? ? ? ? ? ? ?return SingletonHolder.INSTANCE;
? ? ? ? ? }
? ? ?}? ? ?public class Test{undefined
? ? ? ? ? @Autowired
? ? ? ? ? private CxfClient cxfClient;
? ? ? ? ? public void testClient(){undefined
? ? ? ? ? ? ? ?CxfClient.getInstance().createClient();//打印為null.無法注入
? ? ? ? ? ? ? ?cxfClient.createClient();//打印為配置文件中的值
? ? ? ? ? }
? ? ?}
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
怎樣提高mybatis-plus中saveBatch方法的效率
這篇文章主要介紹了怎樣提高mybatis-plus中saveBatch方法的效率問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07
Java實現(xiàn)迷你圖書管理系統(tǒng)案例全程
這篇文章主要為大家詳細介紹了如何利用java語言實現(xiàn)簡單的圖書管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-12-12
Collections工具類_動力節(jié)點Java學院整理
Collections工具類提供了大量針對Collection/Map的操作。這篇文章主要介紹了Collections工具類_動力節(jié)點Java學院整理,需要的朋友可以參考下2017-04-04
Spring?boot詳解fastjson過濾字段為null值如何解決
這篇文章主要介紹了解決Spring?boot中fastjson過濾字段為null值的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
基于String不可變字符與StringBuilder可變字符的效率問題
這篇文章主要介紹了String不可變字符與StringBuilder可變字符的效率問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
IDEA上面搭建一個SpringBoot的web-mvc項目遇到的問題
這篇文章主要介紹了IDEA上面搭建一個SpringBoot的web-mvc項目遇到的問題小結(jié),需要的朋友可以參考下2017-04-04

