Bean的作用域
- Singleton:預設作用域,單例模式,每個容器隻有一個Bean執行個體;
- Prototype:原型模式,每次都産生一個新的bean;
- Request:為每一個請求建立一個bean,請求結束即銷毀;
- Session:同一個session會話共享一個bean;
- Global-session:所有會話共享一個bean執行個體;
Bean的生命周期
總體流程:
執行個體化 ——> 初始化 ——> 使用 ——> 銷毀;
細化流程:
- 執行個體化Bean:通過BeanDefinition對象擷取資訊,執行個體化所有Bean;
- 設定對象屬性:通過依賴注入完成對象屬性設定;
- 處理Aware接口:檢查對象是否實作了Aware接口,并調用相關實作類;
- BeanPostProcesseor前置處理:使用者自定義Bean初始化之前的處理方法;
- InitializingBean:如果Bean實作了InitializingBean接口,執行afeterPropertiesSet()方法;
- init-method:如果配置了init_method方法,則執行初始化方法;
- BeanPostProcesseor後置處理:使用者自定義Bean初始化之後的處理方法;
- 使用bean;
- DisposableBean:使用完,清理階段如果實作了DisposableBean接口,則調用destory方法;
- destroy-method:如果配置了destroy _method方法,則執行銷毀方法;
BeanFactory和ApplicationContext
- BeanFactory:隻是IOC容器,懶加載,啟動時不加載bean,而是第一次調用才執行個體化;
- ApplicationContext:Spring上下文,有spring的進階功能,繼承自BeanFactory,啟動時就執行個體化了所有bean;
BeanPostProcessor和BeanFactoryPostProcessor
- BeanFactoryPostProcessor是針對bean容器的,可以在bean執行個體化之前,去修改bean的屬性、作用域;
- BeanPostProcessor是針對bean的,是在bean執行個體化之後,初始化之前去修改bean的屬性,要晚于BeanFactoryPostProcessor執行;
Bean循環依賴
問題:
- 通過構造方法依賴注入産生循環依賴問題;
- 通過setter方法,且在原型模式下依賴注入産生循環依賴問題;
- 通過setter方法依賴注入産生循環依賴問題;
隻有問題3在spring能被解決;
解決思路:
通過spring的二級、三級緩存解決,二級緩存存儲了Bean提前暴露的引用執行個體,此時Bean還在建立中,二級緩存就已經解決了循環依賴的問題,而三級緩存,加入了ObjectFactory,解決了在對象實作了AOP的情況下,可以提前産生被代理的對象;