在实际开发中经常遇到需要在 Bean 的使用之前或者之后做一些必要的操作,Spring 对 Bean 的生命周期的操作提供了支持.在使用 Java 配置和注解配置下提供如下两种方式:
- Java 配置:使用 @Bean 的 initMethod 和 destroyMethod (相当于 xml 的配置的 init-method 和 destroy-method)
- 注解方式: 利用 JSR-250的@PostConstruct 和 @PreDestory.
示例:
package com.pangu.prepost;
/**
* @ClassName: BeanWayService
* @Description: TODO 使用 @Bean 形式的 Bean
* @author etfox
* @date 2018年8月22日 下午9:39:17
*
* @Copyright: 2018 www.etfox.com Inc. All rights reserved.
*/
public class BeanWayService {
public void init(){
System.out.println("BeanWayService-init....");
}
public BeanWayService(){
super();
System.out.println("初始化构造函数-BeanWayService....");
}
public void destroy(){
System.out.println("BeanWayService-destroy....");
}
}
package com.pangu.prepost;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
/**
* @ClassName: JSR250WayService
* @Description: TODO 使用 JSE250 形式的 Bean
* @author etfox
* @date 2018年8月22日 下午9:39:56
*
* @Copyright: 2018 www.etfox.com Inc. All rights reserved.
*/
public class JSR250WayService {
@PostConstruct
public void init(){
System.out.println("JSR250WayService-init....");
}
public JSR250WayService(){
super();
System.out.println("初始化构造函数-JSR250WayService....");
}
@PreDestroy
public void destroy(){
System.out.println("JSR250WayService-destroy....");
}
}
package com.pangu.prepost;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com.pangu.prepost")
public class PrePostConfig {
@Bean(initMethod="init",destroyMethod="destroy")
BeanWayService beanWayService(){
return new BeanWayService();
}
@Bean
JSR250WayService jsr250WayService(){
return new JSR250WayService();
}
}
测试:
package com.pangu.prepost;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class TestMain {
@SuppressWarnings("unused")
@Test
public void run(){
AnnotationConfigApplicationContext context = new
AnnotationConfigApplicationContext(PrePostConfig.class);
JSR250WayService jsr250WayService = context.getBean(JSR250WayService.class);
BeanWayService beanWayService = context.getBean(BeanWayService.class);
context.close();
}
}
结果:
八月 23, 2018 9:11:30 上午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@762efe5d: startup date [Thu Aug 23 09:11:30 CST 2018]; root of context hierarchy
初始化构造函数-BeanWayService....
BeanWayService-init....
初始化构造函数-JSR250WayService....
JSR250WayService-init....
八月 23, 2018 9:11:30 上午 org.springframework.context.annotation.AnnotationConfigApplicationContext doClose
信息: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@762efe5d: startup date [Thu Aug 23 09:11:30 CST 2018]; root of context hierarchy
JSR250WayService-destroy....
BeanWayService-destroy....