常用的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();
}
}