#Spring生命週期回調說明git
若是隻是簡單的對象初始化,咱們能夠將其放到構造器中處理;若是是對注入的類或者幫助類作一些初始化處理,能夠考慮使用初始化方法。
Spring提供了不少的擴展點,其中就有生命週期回調,咱們能夠在bean初始化以前作一些處理,在bean銷燬以前作一些處理。github
#早期Spring生命週期擴展方式ide
InitializingBean: 容許在bean實例化而且設置好全部的必要屬性以後,執行初始化一些處理。 DisposableBean: bean銷燬前得到一次回調,作一些處理。post
#initMethod和destroyMethodcode
當初咱們使用<bean/>標籤來配置bean的時候,咱們能夠經過init-method和destroy-method來指定bean自定義的回調方法。 當使用@Bean註解來配置bean的時候,咱們經過
@Bean(initMethod="customInit")
和@Bean(destroyMethod="customDestroy")
來指定bean的自定義回調方法。xml
#推薦擴展方式對象
@PostStruct: InitializingBean的替代方案 @PreDestroy:DisposableBean的替代方案接口
#幾種回調方式的順序 能夠看到Spring提供的回調方式有不少種,可是在處理這些回調的時候順序是怎樣的呢,在不看源碼以前,咱們能夠經過實驗來看一下執行順序。生命週期
public class BeanOrder implements InitializingBean, DisposableBean{ public void customInit(){ System.out.println("***我是經過配置init-method來實現的初始化方法。"); } public void customDestroy(){ System.out.println("***我是經過配置destroy-method來實現的初始化方法。"); } @PostConstruct public void initMethod(){ System.out.println("***我是加了@PostConstruct註解的init方法。"); } @PreDestroy public void destroyMethod(){ System.out.println("***我是加了@PreDestroy註解的destroy方法。"); } @Override public void destroy() throws Exception { System.out.println("***我是實現DisposableBean接口的destroy方法。"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("***我是實現InitializingBean接口的afterPropertiesSet方法。"); } }
#####執行結果以下:源碼
***我是加了@PostConstruct註解的init方法。 ***我是實現InitializingBean接口的afterPropertiesSet方法。 ***我是經過配置init-method來實現的初始化方法。 ***我是加了@PreDestroy註解的destroy方法。 ***我是實現DisposableBean接口的destroy方法。 ***我是經過配置destroy-method來實現的初始化方法。
#代碼演練 ####InitializingBean
/** * * Spring官方已經不推薦這種方式來擴展Bean的初始化操做。 * @author Xiaoyang.Li * * https://github.com/superliyang */ @Component public class UseInitializingBean implements InitializingBean{ public void afterPropertiesSet() throws Exception { System.out.println("實現InitializingBean接口來完成初始化操做,跟@PostConstruct意義同樣。"); } }
####DisposableBean
@Component public class UseDisposableBean implements DisposableBean { @Override public void destroy() throws Exception { System.out.println("實現DisposableBean接口來實現bean銷燬以前作一些操做。"); } }
固然了,通常不多單獨使用DisposableBean,不少時候咱們只是單獨使用InitializingBean,或者同時使用InitializingBean和DisposableBean 。
####@PostConstruct and PreDestroy
/** * 生命週期回調(Bean lifecycle callback) * Bean的生命週期擴展是很重要的,首先要知道,bean在生命週期有哪些地方能夠自定義擴展。 * Bean經過@PostConstruct和@PreDestroy來擴展生命週期內的操做。 * 關於使用構造器和初始化方法的分析:若是隻是簡單的對象初始化,咱們能夠將其放到構造器中處理;若是是對注入的類或者幫助類作一些初始化處理,能夠考慮使用初始化方法。 * @author Xiaoyang.Li (https://github.com/superliyang) * */ @Component public class BeanLifeCycleExample { public BeanLifeCycleExample(){ System.out.println("初始化構造器"); } @PostConstruct public void initMethod(){ //該方式跟在xml中bean標籤上設置init-method是同樣的。 //<bean id="exampleInitBean" class="examples.ExampleBean" init-method="init"/> System.out.println("@PostConstruct容許容器bean建立並設置好全部必要屬性以後,作出一些初始化處理"); } @PreDestroy public void destroyMethod(){ //該方式跟在xml中bean標籤上設置destroy-method是同樣的。 //<bean id="exampleInitBean" class="examples.ExampleBean" destroy-method="cleanup"/> System.out.println("@PreDestroy容許在bean銷燬以前作出一些處理"); } public void postProcessBeforeInitializationTest(){ System.out.println("在bean實例化完成,調用初始化方法以前,來調用我吧。"); } }