在我们实际开发的时候,经常会遇到在Bean在使用之前或者之后做些必要的操作, Spring对Bean的生命周期提供了支持。在使用Java配置和注解配置下提供如下两种方式:
(1) Java配置方式:使用@Bean的initMethod(相当于xml配置的init-method和destory-method)。
(2) 注解方式:利用JSR-250的@PostConstruct和@PreDestory。
示例:
(1) 增加JSR250 支持
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
</dependency>
(2) 使用@Bean形式的Bean。
package com.wisely.highlight_spring.ch2.prepost;
public class BeanWayService {
public BeanWayService() {
super();
System.out.println("初始化构造函数-BeanWayService");
}
public void init() {
System.out.println("@Bean-init-method");
}
public void destory() {
System.out.println("@Bean-destory-method");
}
}
(3) 使用JSR250形式的Bean
package com.wisely.highlight_spring.ch2.prepost;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.springframework.stereotype.Service;
@Service
public class JSR250WayService {
@PostConstruct //构造函数执行完之后执行
public void init() {
System.out.println("jsr250-init-method");
}
public JSR250WayService() {
System.out.println("初始化构造函数-jsr250WayService");
}
@PreDestroy //在Bean销毁之前执行
public void destory() {
System.out.println("jsr250-destory-method");
}
}
(4) 配置类
package com.wisely.highlight_spring.ch2.prepost;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com.wisely.highlight_spring.ch2.prepost")
public class PrePostConfig {
@Bean(initMethod="init",destroyMethod="destory") //initMethod和desMethod指定BeanWayMethod的init和destory方法在构造之后、Bean销毁之前执行
BeanWayService beanWayService() {
return new BeanWayService();
}
// @Bean
// JSR250WayService jsr250WayService() {
// return new JSR250WayService();
// }
}
(5) 运行
package com.wisely.highlight_spring.ch2.prepost;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(PrePostConfig.class);
context.getBean(BeanWayService.class);
context.getBean(JSR250WayService.class);
context.close();
}
}
结果如下图所示: