为什么使用@PostConstruct?

在受管 Bean 中,在常规 Java 对象构造函数之后调用。@PostConstruct

为什么我要使用bean而不是常规构造函数本身进行初始化?@PostConstruct


答案 1
  • 因为当调用构造函数时,Bean 尚未初始化 - 即没有注入任何依赖项。在该方法中,Bean 已完全初始化,您可以使用依赖项。@PostConstruct

  • 因为这是保证此方法在 Bean 生命周期中仅调用一次的协定。容器在其内部工作中可能会发生(尽管不太可能)Bean 实例化的情况,但它保证该 Bean 只会被调用一次。@PostConstruct


答案 2

主要问题是:

在构造函数中,依赖项的注入尚未发生*

*明显排除构造函数注入


实际示例:

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'

推荐