为什么使用@PostConstruct?
2022-08-31 04:41:58
在受管 Bean 中,在常规 Java 对象构造函数之后调用。@PostConstruct
为什么我要使用bean而不是常规构造函数本身进行初始化?@PostConstruct
在受管 Bean 中,在常规 Java 对象构造函数之后调用。@PostConstruct
为什么我要使用bean而不是常规构造函数本身进行初始化?@PostConstruct
因为当调用构造函数时,Bean 尚未初始化 - 即没有注入任何依赖项。在该方法中,Bean 已完全初始化,您可以使用依赖项。@PostConstruct
因为这是保证此方法在 Bean 生命周期中仅调用一次的协定。容器在其内部工作中可能会发生(尽管不太可能)Bean 实例化的情况,但它保证该 Bean 只会被调用一次。@PostConstruct
主要问题是:
在构造函数中,依赖项的注入尚未发生*
*明显排除构造函数注入
实际示例:
public class Foo {
@Inject
Logger LOG;
@PostConstruct
public void fooInit(){
LOG.info("This will be printed; LOG has already been injected");
}
public Foo() {
LOG.info("This will NOT be printed, LOG is still null");
// NullPointerException will be thrown here
}
}
重要提示:在 Java 11 中已完全删除。@PostConstruct
@PreDestroy
要继续使用它们,您需要将javax.annotation-api JAR添加到您的依赖项中。
<!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api -->
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
// https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api
compile group: 'javax.annotation', name: 'javax.annotation-api', version: '1.3.2'