Spring6 探析之 Bean 的创建于销毁
Spring6 探析之 Bean 的创建于销毁
介绍
控制 bean 的创建与销毁有两类方法
- 在配置类中使用 @Bean 注解的 initMethod 和 destroyMethod 参数
- 使用 JSP250 规范中的 @PostConstruct 和 @PreDestroy 注解
我们对这两种方式做一些简单的比较
要使用 JSP250 中的注解,需要配置maven
<dependency>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
<version>2.1.1</version>
</dependency>
看一下 @PostConstruct 和 @PreDestroy 的源码吧
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface PostConstruct {
}
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface PreDestroy {
}
它们的作用:
- 被 @PostConstruct 标记的方法会在构造方法之后执行,用于自定义bean的初始化操作
- 被 @PreDestroy 标记的方法会在bean销毁前执行,用于自定义bean的销毁操作
这两个注解没有参数,并且只能被标记在方法上
实战
创建 PostBean,为了方便演示与比较,这里定义了两组创建和销毁的方法,一个使用JSR250,一个使用 spring中自带的 @Bean 管理
public class PostBean {
public PostBean() {
System.out.println("构造方法执行了");
}
public void init() {
System.out.println("自定义方法 init() 执行了");
}
public void destroy() {
System.out.println("自定义销毁方法执行了");
}
@PostConstruct
public void postConstruct() {
System.out.println("被注解的 postConstruct() 方法执行了");
}
@PreDestroy
public void preDestroy() {
System.out.println("被注解的 preDestroy() 方法执行了");
}
}
接着,在配置类中装载这个bean
@Configuration
public class PostBeanConfig {
@Bean(initMethod = "init", destroyMethod = "destroy")
public PostBean postBean() {
return new PostBean();
}
}
在这里我又使用了 @Bean 的方式管理创建于销毁
写个Main验证下:
public class Main {
public static void main(String[] args) {
System.out.println("IOC容器 开始创建");
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(PostBeanConfig.class);
System.out.println("IOC容器 创建结束");
context.close();
}
}
输出结果如下,通过输出结果比较下这两种方法的差别吧
IOC容器 开始创建
构造方法执行了
被注解的 postConstruct() 方法执行了
自定义方法 init() 执行了
IOC容器 创建结束
被注解的 preDestroy() 方法执行了
自定义销毁方法执行了