天天看點

Spring Bean作用域與聲明周期

Bean的作用域

  1. Singleton:預設作用域,單例模式,每個容器隻有一個Bean執行個體;
  2. Prototype:原型模式,每次都産生一個新的bean;
  3. Request:為每一個請求建立一個bean,請求結束即銷毀;
  4. Session:同一個session會話共享一個bean;
  5. Global-session:所有會話共享一個bean執行個體;

Bean的生命周期

Spring Bean作用域與聲明周期

總體流程:

執行個體化 ——> 初始化 ——> 使用 ——> 銷毀;

細化流程:

  1. 執行個體化Bean:通過BeanDefinition對象擷取資訊,執行個體化所有Bean;
  2. 設定對象屬性:通過依賴注入完成對象屬性設定;
  3. 處理Aware接口:檢查對象是否實作了Aware接口,并調用相關實作類;
  4. BeanPostProcesseor前置處理:使用者自定義Bean初始化之前的處理方法;
  5. InitializingBean:如果Bean實作了InitializingBean接口,執行afeterPropertiesSet()方法;
  6. init-method:如果配置了init_method方法,則執行初始化方法;
  7. BeanPostProcesseor後置處理:使用者自定義Bean初始化之後的處理方法;
  8. 使用bean;
  9. DisposableBean:使用完,清理階段如果實作了DisposableBean接口,則調用destory方法;
  10. destroy-method:如果配置了destroy _method方法,則執行銷毀方法;

BeanFactory和ApplicationContext

  1. BeanFactory:隻是IOC容器,懶加載,啟動時不加載bean,而是第一次調用才執行個體化;
  2. ApplicationContext:Spring上下文,有spring的進階功能,繼承自BeanFactory,啟動時就執行個體化了所有bean;

BeanPostProcessor和BeanFactoryPostProcessor

  1. BeanFactoryPostProcessor是針對bean容器的,可以在bean執行個體化之前,去修改bean的屬性、作用域;
  2. BeanPostProcessor是針對bean的,是在bean執行個體化之後,初始化之前去修改bean的屬性,要晚于BeanFactoryPostProcessor執行;

Bean循環依賴

問題:

  1. 通過構造方法依賴注入産生循環依賴問題;
  2. 通過setter方法,且在原型模式下依賴注入産生循環依賴問題;
  3. 通過setter方法依賴注入産生循環依賴問題;

隻有問題3在spring能被解決;

解決思路:

通過spring的二級、三級緩存解決,二級緩存存儲了Bean提前暴露的引用執行個體,此時Bean還在建立中,二級緩存就已經解決了循環依賴的問題,而三級緩存,加入了ObjectFactory,解決了在對象實作了AOP的情況下,可以提前産生被代理的對象;