最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

聊一聊new對象與Spring對bean的初始化的差別

 更新時間:2022年02月25日 10:47:26   作者:一個非典型的程序員  
這篇文章主要介紹了聊一聊new對象與Spring對bean的初始化的差別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

new對象與Spring對bean初始化差別

這個問題是一次我將老系統(tǒng)代碼遷移到基于Spring構(gòu)建的新系統(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方法進入
  • refreshContext
  • refresh
  • finishBeanFactoryInitialization(完成beanFactory的初始化)
  • preInstantiateSingletons(初始化單例)
  • getBean(獲取Bean)
  • doGetBean
  • createBean
  • doCreateBean(此方法內(nèi)部會createBean,創(chuàng)建bean即構(gòu)造方法執(zhí)行)
  • populateBean(進行autowired自動注入)
  • applyPropertyValues(進行屬性注入)

PS:new對象,不能導致對象依賴的注入屬性自動賦值,只有對對象進行注入,對象依賴的注入屬性才能賦值;

且注入的屬性不能在構(gòu)造函數(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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

五峰| 沁水县| 嫩江县| 班戈县| 临夏市| 和林格尔县| 合肥市| 砀山县| 苏尼特右旗| 宝应县| 五台县| 永济市| 基隆市| 蓝田县| 临澧县| 会宁县| 巴里| 宽甸| 布拖县| 松溪县| 永定县| 普洱| 加查县| 江门市| 汾阳市| 金昌市| 瑞昌市| 永宁县| 徐州市| 曲水县| 东港市| 巴东县| 都兰县| 闸北区| 晴隆县| 西城区| 旌德县| 都匀市| 峨边| 克东县| 淮北市|