關於Spring 裏面Bean的幾種初始化、銷燬方法(init, destroy)

常用的Spring Bean如何指定其初始化和銷燬前的方法有以下幾種:

1. @PostConstruct @PreDestroy註解方式

   @PostConstruct
   public void init(){
   }
   
   @PreDestroy
   public void destroyAn(){
   }

2. 實現 InitializingBean 和 DisposableBean 接口

public class MyBean implements  InitializingBean, DisposableBean {

   @Override
   public void destroy() throws Exception {
   	logger.info("DisposableBean destroy...");
   }

   @Override
   public void afterPropertiesSet() throws Exception {
   	logger.info("InitializingBean afterPropertiesSet...");
   }
}

3. @Bean實例化方式 指定初始化銷燬前方法

  
  @Bean(initMethod = "init", destroyMethod = "destroy")
  public MyBean myBean(){
      return new MyBean ();
  }
  

它們和構造函數一起使用時執行的順序

寫個java例子測試一下,得出如下的順序結論:

執行順序如下
1. 構造函數執行
2. @PostConstruct
3. InitializingBean afterPropertiesSet 方法
4. @Bean initMethod 方法
5. @PreDestroy
6. DisposableBean destroy方法
7. @Bean destroyMethod 方法

測試用例


package com.middol.mytest.config.beantest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.BeanPostProcessor;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * 初始化順序測試
 *
 * @author admin
 */
public class MyBeanPostProcessor implements InitializingBean, DisposableBean {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    public MyBeanPostProcessor() {
        logger.info("");
        logger.info("++++++++++++++++++++++++++++++++++");
        logger.info("myBeanPostProcessor 構造函數執行...");
        logger.info("++++++++++++++++++++++++++++++++++");
    }

    @PostConstruct
    public void init(){
        logger.info("");
        logger.info("++++++++++++++++++++++++++++++++++");
        logger.info("myBeanPostProcessor PostConstruct 函數執行...");
        logger.info("++++++++++++++++++++++++++++++++++");
    }

    @PreDestroy
    public void destroyAn(){
        logger.info("");
        logger.info("++++++++++++++++++++++++++++++++++");
        logger.info("myBeanPostProcessor PreDestroy 函數執行...");
        logger.info("++++++++++++++++++++++++++++++++++");
    }

    public void beanInit(){
        logger.info("");
        logger.info("++++++++++++++++++++++++++++++++++");
        logger.info("myBeanPostProcessor beanInit 函數執行...");
        logger.info("++++++++++++++++++++++++++++++++++");
    }

    public void beanDestroy(){
        logger.info("");
        logger.info("++++++++++++++++++++++++++++++++++");
        logger.info("myBeanPostProcessor beanDestroy 函數執行...");
        logger.info("++++++++++++++++++++++++++++++++++");
    }

    @Override
    public void destroy() throws Exception {
        logger.info("");
        logger.info("++++++++++++++++++++++++++++++++++");
        logger.info("myBeanPostProcessor DisposableBean destroy...");
        logger.info("++++++++++++++++++++++++++++++++++");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        logger.info("");
        logger.info("++++++++++++++++++++++++++++++++++");
        logger.info("myBeanPostProcessor InitializingBean afterPropertiesSet...");
        logger.info("++++++++++++++++++++++++++++++++++");
    }
}

package com.middol.mytest.config.beantest;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 初始化順序測試
 *
 * @author admin
 */
@Configuration
public class MyBeanPostProcessorConfig {

    @Bean(initMethod = "beanInit", destroyMethod = "beanDestroy")
    public MyBeanPostProcessor myBeanPostProcessor(){
        return new MyBeanPostProcessor();
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章