Spring Bean的生命周期
1 容器初始化
BeanFactory容器初始化:包含容器建立,資源定位,載入,注冊。
ApplicationContext容器初始化:包含容器建立,資源定位,載入,注冊,Bean生命周期管理等。
1.1 容器初始化流程:
2 Bean的生命周期
針對ApplicationContext類型容器,在完成Bean資源加載和注冊之後,即進入Bean的生命周期,包含執行個體化、初始化以及增強,回調等。增強及回調方法如下所示:
2.1 Aware接口
Spring Bean與容器是解耦的,Bean無法感覺容器的資訊。
Aware是一個具有辨別作用的接口,實作該接口的Bean具有被Spring容器通知的能力,本質是通過回調(即在啟動時掃描Aware的實作類并實作容器資訊注入)。該接口主要在Spring内部架構使用。
2.1.1 為什麼使用Aware
Spring Bean與容器是解耦的,Bean無法感覺容器的資訊。
傳統方式是無法擷取Bean在容器中的名稱的,實作了BeanNameAware的Bean,可以在Bean中重寫setBeanName()方法,在IOC初始化時,容器會調用該實作Aware的Bean的setBeanName()方法,進而可以得到容器中Bean的名稱。
是以BeanNameAware接口是為了讓自身Bean能夠感覺到,擷取到自身在Spring容器中的id屬性。
2.1.2 常用的Aware
- BeanNameAware 擷取容器中Bean的名稱
- BeanFactoryAware 擷取目前BeanFactory,進而調用容器的服務
- ApplicationContextAware 擷取目前ApplicationContext,進而調用容器的服務
- ApplicationEventPublisherAware 用于事件的釋出
- ResourceLoaderAware 擷取資源加載器,可以擷取外部資源檔案
2.2 BeanFactoryPostProcessor接口
BeanFactoryPostProcessor是針對于Bean容器的。是在BeanDefinition加載後,Bean執行個體化之前。操作對象是bean definitions
2.2.1 beanDefinition和擴充卡模式
關于BeanDefinition的使用模式,官網将其稱呼為configuration metadata,直譯過來叫“配置中繼資料”。 他的作用有點類似于Context分層應用的效果(見Spring核心——上下文與IoC 關于 ApplicationContext的說明),目的就是将Bean的配置和初始化工作分成2個互不幹擾的部分。
我們知道 Spring現在支援各種各樣的方式來添加Bean,比如在XML配置檔案中使用标簽、使用@Component以及他的派生類注解、可以在@Configuration類中生成、甚至還可以通過RMI實作遠端配置等等。如果所有的這些配置來源直接和IoC容器産生關系生成Bean,那麼耦合度、代碼複雜度會越來越高,而且以後指不定什麼時候又會加入什麼新的配置方式。
為了解決這個問題Spring的大神們引入了擴充卡模式——IoC容器隻接受BeanDefinition接口,IoC如何初始化一個Bean是僅僅是看BeanDefinition裡的資訊。而各種配置方式都有自己的擴充卡,所有的擴充卡都會根據他所需要處理的内容來生成一個BeanDefinition的實作類。這樣,如果新增一個新的配置方式,增加一個擴充卡就可以搞定。
2.2.2 為什麼使用BeanFactoryPostProcessor
定制和修改容器的BeanDefinitions資訊。
2.2.3 常用的BeanFactoryPostProcessor接口
PropertyResourceConfigurer :典型實作 屬性替換的功能
CustomEditorConfigurer :典型實作 添加自定義屬性編輯器的功能
ConfigurationClassPostProcessor:啟動@Configuration的掃描功能
2.3 BeanPostProcessor接口
BeanPostProcessor是針對于Bean的。是在Bean執行個體化後,初始化之前。操作對象是bean instance
2.3.1 為什麼使用
Spring容器通過BeanPostProcessor給了我們一個機會對Spring管理的bean進行再加工。比如:我們可以修改bean的屬性,可以給bean生成一個動态代理執行個體等等。一些Spring AOP的底層處理也是通過實作BeanPostProcessor來執行代理包裝邏輯的。
2.3.2 常用的BeanPostProcessor接口
- RequiredAnnotationBeanPostProcessor 它用于處理@Required注解。當我們一個Setter方法加入@Required後,表示必須設定參數,如果未設定則抛出BeanInitializationException異常。
- AutowiredAnnotationBeanPostProcessor 這個後置處理器在3.x之後使用Spring架構的系統幾乎都會使用,就是他在處理大名鼎鼎的@Autowired和@Value注解。