1. 程式人生 > >springBean生命周期

springBean生命周期

架構 滿足 troy 方法 ring con The 來看 property

在整個生命周期中,修改bean的方式大致有如下幾種:

  1. 實現 InitializingBean接口 的 afterPropertiesSet()

  2. 實現 DisposableBean接口的 destroy()

  3. 給方法加@PostConstruct和@PreDestroy註解,需要說明一點,這兩個註解是JSR250標準中的,而Spring中InitDestroyAnnotationBeanPostProcessor類實現了這個標準

  4. 以xml的方式定義bean時,指定init method和destroy method

    <bean id="testBeanLifeCycle" class="org.springframework.samples.mvc.beanPostProcessor.TestBeanLiftCycle"
    init-method="xmlInit" destroy-method="xmlDestroy">
    <property name="message" value="Hello World!"/</bean>

在眾多的lifecycle機制中,假設一個bean使用了上邊所有的方式,那麽它們的執行順序是這樣的:

  • Methods annotated with @PostConstruct

  • afterPropertiesSet() as defined by the InitializingBean callback interface

  • A custom configured init() method

  • Methods annotated with @PreDestroy

  • destroy() as defined by the DisposableBean callback interface

  • A custom configured destroy() method

我們在代碼中來看

在Spring中,bean的生命周期管理都是由beanFactory來管理,上一篇我們有提到,實現了beanFactory的類AbstractAutowiredCapableBeanFactory完成了bean的init和destroy的工作,初始化方法是

技術分享圖片

invokeInitMethods方法如下

技術分享圖片

接下來看看destroy邏輯,在AbstractAutowiredCapableBeanFactory中我們找到destroy方法

技術分享圖片

再來看DisposableBeanAdapter的destroy做了什麽

技術分享圖片

來看個小demo來驗明正身

  • 定義Spring bean TestBeanLifeCycle

技術分享圖片

  • 在applicationContext.xml中聲明bean

技術分享圖片

  • 以Junit方式啟動容器

技術分享圖片

  • 然後我們會看到下面的輸出:

技術分享圖片

說了這麽多機制,那麽我們在使用的時候要註意什麽

推薦使用@PostConstruct和@PreDestroy,因為這來自JSR250,對Spring框架0耦合。

除此之外,Spring還提供了LifeCycle接口和LifeCycleProcessor接口,實現這些接口能讓bean的lifecycle關聯到Container的lifeCycle,當容器有啟動,停止,刷新等動作時,會回調到bean。

如果說所有這些Spring提供的機制還是不能滿足你的需求,那麽總有一款適合你——BeanPostProcessor接口,事實上在Spring架構內部,眾多的beanPostProcessor實現,能完成各種接口的回調,或者自定義方法的觸發。

springBean生命周期