关于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();
    }
}

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