注意事項---spring

註解:

@Import:用於注入到Bean 。(注意:如果重複注入,很有可能會導致覆蓋原有的bean)

spring中的@import註解

 

------------------------------------------------------------------------------------------------------------------

 

單例生成方式(靜態內部類,枚舉單例,可有效使用到併發):

靜態類部類:初始化單例,可用靜態內部類來初始化,解決併發,繼承餓漢式和懶漢式的優點,同時解決第一次初始化慢的問題,讀寫不需要鎖

 

單例多例初始化的區別:

單例bean默認再啓動時就被初始化加載到ioc容器裏面,而多例是通過每次獲取bean對象時纔會被創建初始化

 

注入bean方式:

提供方:

@Autowired是由org.springframework.beans.factory.annotation.Autowired提供,換句話說就是由Spring提供;

@Resource是由javax.annotation.Resource提供,即J2EE提供,需要JDK1.6及以上。

注入方式:

@Autowired只按照通過 類型 注入;

@Resource默認 按類名稱小寫 自動注入,也提供按照類型注入,name和type屬性進行選擇性注入;

 

Springbean 生命週期(簡要):

bean創建(執行構造函數)==>初始化(自定義init方法)==>銷燬  (初始化方法和銷燬方法都可自定義)

bean存儲方式:

使用ConurrentHashMap 存儲對象,爲了保證在多線程情況下線程安全性

 

Spring上下文獲取bean的實現方法:

實現ApplicationContextAware接口來獲取bean(可參考:Spring中ApplicationContextAware的作用 實現上下文獲取bean

 

SpringBean簡要生命週期:

 

 Bean實例生命週期的執行過程如下:

  • Spring對bean進行實例化,默認bean是單例;

  • Spring對bean進行依賴注入;

  • 如果bean實現了BeanNameAware接口,spring將bean的id傳給setBeanName()方法;

  • 如果bean實現了BeanFactoryAware接口,spring將調用setBeanFactory方法,將BeanFactory實例傳進來;

  • 如果bean實現了ApplicationContextAware接口,它的setApplicationContext()方法將被調用,將應用上下文的引用傳入到bean中;

  • 如果bean實現了BeanPostProcessor接口,它的postProcessBeforeInitialization方法將被調用;

  • 如果bean實現了InitializingBean接口,spring將調用它的afterPropertiesSet接口方法,類似的如果bean使用了init-method屬性聲明瞭初始化方法,該方法也會被調用;

  • 如果bean實現了BeanPostProcessor接口,它的postProcessAfterInitialization接口方法將被調用;

  • 此時bean已經準備就緒,可以被應用程序使用了,他們將一直駐留在應用上下文中,直到該應用上下文被銷燬;

  • 若bean實現了DisposableBean接口,spring將調用它的distroy()接口方法。同樣的,如果bean使用了destroy-method屬性聲明瞭銷燬方法,則該方法被調用;

 

springbean的循環依賴:

當兩對象都爲單例,則 spring會採用三級緩存(緩存中的對象都是非完整對象--即屬性沒賦值的),當放入一級緩存前,對象會先放入三級緩存裏(用於存放非完整對象),,,一級緩存爲完整對象

當兩對象都爲多例,則會產生死循環從而報錯

原理如圖下:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章