目录
- 1.简介
- 2.使用
- 3.注意事项
- 4.执行顺序
- 5.测试
- 6.测试结果
1.简介
@PostConstruct: Java 自带的注解,在方法上使用该注解,会在项目
启动的时候执行
被修饰的方法。@PreDestroy: Java 自带的注解,在方法上使用该注解,会在项目
停止的时候执行
被修饰的方法。
从 Java EE5
开始,@PostConstruct 和 @PreDestroy 被增加用来影响 Servlet 的生命周期,这两个注解用来修饰一个非静态的 void()
方法。
2.使用
用法1:
@PostConstruct
public void someMethod(){}
用法2:
public @PostConstruct void someMethod(){}
3.注意事项
- 注解修饰的方法,不能有入参。
否则抛出异常:Lifecycle method annotation requires a no-arg method
- 注解所在类必须保证会注入,一般用@Component注解修饰,否则不生效。
- 注解修饰的方法,返回值是 void。
只是建议,实际上是可以有返回值,springboot启动没有报错,但@PostConstruct 一般仅用于初始化bean、预加载常规数据用,所以一般不需要返回值。
4.执行顺序
- 从依赖注入(DI)的概念我们知道,要将一个对象注入到另一个对象中,那么首先必须得生成这两个对象的实例。所以,当类 a 中有一个对象 p 的成员变量被 @Autowired 注解修饰,那么 @Autowired 注入对象 p 是在对象 a 的构造方法执行完毕之后进行的。
- 如果想在生成对象时完成某些初始化操作,而偏偏这些初始化操作又依赖于依赖注入,那么就无法在构造函数中实现。此时可以使用 @PostConstruct 注解修饰一个方法来完成初始化,@PostConstruct 注解会让方法在依赖注入完成后被自动调用。
5.测试
AnnotationTest.java
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
/**
* <p> @Title AnnotationTest
* <p> @Description Bean记载测试类
*
* @author ACGkaka
* @date 2023/1/5 10:45
*/
@Slf4j
@Component
public class AnnotationTest implements InitializingBean, DisposableBean {
@PostConstruct
public void postConstruct() {
log.info("PPPPPostConstruct........");
}
@PreDestroy
public void preDestroy() throws InterruptedException {
log.info("PPPPPreDestroy.......");
}
@Override
public void afterPropertiesSet() throws Exception {
log.info("IIIIIInitializingBean........");
}
@Override
public void destroy() throws Exception {
log.info("DDDDDisposable.......");
}
}
6.测试结果
项目启动日志:
项目停止日志:
测试结果证实如下顺序:
@PostConstruct
->InitializingBean
@PreDestroy
->DisposableBean
整理完毕,完结撒花~
参考地址:
1.@PostConstruct详解,https://blog.csdn.net/sunayn/article/details/92840439
2.java:@PostConstruct注解使用,https://blog.csdn.net/a232884c/article/details/122683275