Spring Bean 生命週期回調

#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實例化完成,調用初始化方法以前,來調用我吧。");
    }
    
}
相關文章
相關標籤/搜索