註解:
@Import:用於注入到Bean 。(注意:如果重複注入,很有可能會導致覆蓋原有的bean)
------------------------------------------------------------------------------------------------------------------
單例生成方式(靜態內部類,枚舉單例,可有效使用到併發):
靜態類部類:初始化單例,可用靜態內部類來初始化,解決併發,繼承餓漢式和懶漢式的優點,同時解決第一次初始化慢的問題,讀寫不需要鎖
單例多例初始化的區別:
單例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會採用三級緩存(緩存中的對象都是非完整對象--即屬性沒賦值的),當放入一級緩存前,對象會先放入三級緩存裏(用於存放非完整對象),,,一級緩存爲完整對象
當兩對象都爲多例,則會產生死循環從而報錯
原理如圖下: