1. 程式人生 > >Spring容器中的Bean幾種初始化方法和銷燬方法的先後順序

Spring容器中的Bean幾種初始化方法和銷燬方法的先後順序

Spring 容器中的 Bean 是有生命週期的spring 允許 Bean 在初始化完成後以及銷燬前執行特定的操作。下面是常用的三種指定特定操作的方法:

  • 通過實現InitializingBean/DisposableBean 介面來定製初始化之後/銷燬之前的操作方法;
  • 通過<bean> 元素的 init-method/destroy-method屬性指定初始化之後 /銷燬之前呼叫的操作方法;
  • 在指定方法上加上@PostConstruct或@PreDestroy註解來制定該方法是在初始化之後還是銷燬之前呼叫。

這幾種配置方式,執行順序是怎樣的呢?我們通過例子來研究下:

Java類:

  1. import
     javax.annotation.PostConstruct;  
  2. import javax.annotation.PreDestroy;  
  3. import org.springframework.beans.factory.DisposableBean;  
  4. import org.springframework.beans.factory.InitializingBean;  
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  6. publicclass InitAndDestroySeqBean 
    implements InitializingBean,DisposableBean {  
  7.     public InitAndDestroySeqBean(){  
  8.         System.out.println("執行InitAndDestroySeqBean: 構造方法");  
  9.     }  
  10.     @PostConstruct
  11.     publicvoid postConstruct() {    
  12.        System.out.println("執行InitAndDestroySeqBean: postConstruct");    
  13.     }    
  14.     @Override
  15.     publicvoid afterPropertiesSet() throws Exception {  
  16.         System.out.println("執行InitAndDestroySeqBean: afterPropertiesSet");   
  17.     }  
  18.     publicvoid initMethod() {  
  19.         System.out.println("執行InitAndDestroySeqBean: init-method");  
  20.     }  
  21.     @PreDestroy
  22.     publicvoid preDestroy()  {  
  23.         System.out.println("執行InitAndDestroySeqBean: preDestroy");  
  24.     }  
  25.     @Override
  26.     publicvoid destroy() throws Exception {  
  27.         System.out.println("執行InitAndDestroySeqBean: destroy");  
  28.     }  
  29.     publicvoid destroyMethod() {  
  30.         System.out.println("執行InitAndDestroySeqBean: destroy-method");  
  31.     }  
  32.     publicstaticvoid main(String[] args) {  
  33.         ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("com/chj/spring/bean.xml");  
  34.         context.close();  
  35.     }  
  36. }  
Spring配置檔案:
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <beansxmlns="http://www.springframework.org/schema/beans"
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.      xmlns:context="http://www.springframework.org/schema/context"
  5.      xsi:schemaLocation="http://www.springframework.org/schema/beans    
  6.  http://www.springframework.org/schema/beans/spring-beans-2.5.xsd    
  7.  http://www.springframework.org/schema/context    
  8.  http://www.springframework.org/schema/context/spring-context-2.5.xsd">
  9.    <context:annotation-config/>
  10.    <beanid="initAndDestroySeqBean"class="com.chj.spring.InitAndDestroySeqBean"init-method="initMethod"destroy-method="destroyMethod"/>
  11. </beans>
執行InitAndDestroySeqBean的main方法,結果如下:
  1. 2013-03-03 17:11:19,098 DEBUG support.DefaultListableBeanFactory - Creating instance of bean 'initAndDestroySeqBean'  
  2. 執行InitAndDestroySeqBean: 構造方法  
  3. 2013-03-03 17:11:19,114 DEBUG annotation.CommonAnnotationBeanPostProcessor - Found init method on class [com.alibaba.chj.spring.InitAndDestroySeqBean]: public void com.alibaba.chj.spring.InitAndDestroySeqBean.postConstruct()  
  4. 2013-03-03 17:11:19,114 DEBUG annotation.CommonAnnotationBeanPostProcessor - Found destroy method on class [com.alibaba.chj.spring.InitAndDestroySeqBean]: public void com.alibaba.chj.spring.InitAndDestroySeqBean.preDestroy()  
  5. 2013-03-03 17:11:19,129 DEBUG support.DefaultListableBeanFactory - Eagerly caching bean 'initAndDestroySeqBean' to allow for resolving potential circular references  
  6. 2013-03-03 17:11:19,129 DEBUG annotation.CommonAnnotationBeanPostProcessor - Invoking init method on bean 'initAndDestroySeqBean': public void com.alibaba.chj.spring.InitAndDestroySeqBean.postConstruct()  
  7. 執行InitAndDestroySeqBean: postConstruct  
  8. 2013-03-03 17:11:19,129 DEBUG support.DefaultListableBeanFactory - Invoking afterPropertiesSet() on bean with name 'initAndDestroySeqBean'  
  9. 執行InitAndDestroySeqBean: afterPropertiesSet  
  10. 2013-03-03 17:11:19,129 DEBUG support.DefaultListableBeanFactory - Invoking init method  'initMethod' on bean with name 'initAndDestroySeqBean'  
  11. 執行InitAndDestroySeqBean: init-method  
  12. 2013-03-03 17:11:19,129 DEBUG support.DefaultListableBeanFactory - Finished creating instance of bean 'initAndDestroySeqBean'  
  13. 2013-03-03 17:11:19,129 INFO  support.ClassPathXmlApplicationContext - Closing org[email protected]56a499: display name [org[email protected]56a499]; startup date [Sun Mar 03 17:11:17 CST 2013]; root of context hierarchy  
  14. 2013-03-03 17:11:19,129 INFO  support.DefaultListableBeanFactory - Destroying singletons in org.s[email protected]1292d26: defining beans [org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,initAndDestroySeqBean]; root of factory hierarchy  
  15. 2013-03-03 17:11:19,129 DEBUG annotation.CommonAnnotationBeanPostProcessor - Invoking destroy method on bean 'initAndDestroySeqBean': public void com.alibaba.chj.spring.InitAndDestroySeqBean.preDestroy()  
  16. 執行InitAndDestroySeqBean: preDestroy  
  17. 2013-03-03 17:11:19,145 DEBUG support.DisposableBeanAdapter - Invoking destroy() on bean with name 'initAndDestroySeqBean'  
  18. 執行InitAndDestroySeqBean: destroy  
  19. 2013-03-03 17:11:19,145 DEBUG support.DisposableBeanAdapter - Invoking destroy method 'destroyMethod' on bean with name 'initAndDestroySeqBean'  
  20. 執行InitAndDestroySeqBean: destroy-method  
從執行結果可以看出:

Bean在例項化的過程中:Constructor > @PostConstruct >InitializingBean > init-method

Bean在銷燬的過程中:@PreDestroy > DisposableBean > destroy-method