天天看點

【一文讀懂】Spring Bean生命周期詳解

Spring Bean的生命周期

1 容器初始化

BeanFactory容器初始化:包含容器建立,資源定位,載入,注冊。

ApplicationContext容器初始化:包含容器建立,資源定位,載入,注冊,Bean生命周期管理等。

1.1 容器初始化流程:
【一文讀懂】Spring Bean生命周期詳解

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注解。