springBean生命周期
在整個生命周期中,修改bean的方式大致有如下幾種:
-
實現 InitializingBean接口 的 afterPropertiesSet()
-
實現 DisposableBean接口的 destroy()
-
給方法加@PostConstruct和@PreDestroy註解,需要說明一點,這兩個註解是JSR250標準中的,而Spring中InitDestroyAnnotationBeanPostProcessor類實現了這個標準
-
以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生命周期