【问题标题】:Method with annotation @PostConstruct (javax) doesn't call带有注释@PostConstruct(javax)的方法不会调用
【发布时间】:2020-02-02 16:23:02
【问题描述】:

是否可以在使用 javax 中的注解调用构造函数后立即调用特定的初始化方法?

我在调用构造函数后立即将@Inject注释(javax.inject.Inject)放在我想在方法中使用@PostConstruct注释(javax.annotation.PostConstruct)初始化的字段上,但是这个init方法没有被调用并且NPE崩溃.

public class ClassChild extends ClassParent{

   @Inject
   private SomeService someService;


   @PostConstruct
   public void init(){

      someService = new SomeService(getSomeValues())  // getSomeValues() a method from parent
   }

我是否正确使用了这些注释?问题是什么?如何在调用 ClassChild 构造函数后立即调用 init() 方法?如果有任何帮助,我将不胜感激!

【问题讨论】:

  • 全错了。您正在尝试使用@PostConstruct 来初始化应该注入的someService
  • 你为什么要初始化一些实际上是要注入/自动装配的东西(在这种情况下是SomeService)?此外,使用@PostConstruct 注释的方法通常用于消耗注入的 bean 或在此 bean 准备好后执行任何操作。
  • @Isank 我从来没有使用过这些注释,所以我做错了。我只需要在创建 ClassChild 实例后立即初始化“someService”(无需显式调用 init())。

标签: java dependency-injection postconstruct


【解决方案1】:

您的 ClassChild 不是托管对象(例如 Spring 中的 @Component),因此 @Inject@PostConstruct 都不起作用。你不应该调用构造函数,你需要让框架初始化ClassChild,之后框架也会调用@PostConstruct方法。

【讨论】:

  • 知道了。谢谢。
【解决方案2】:

注意@PostConstruct 和@PreDestroy 注释都是Java EE 的一部分。由于 Java EE 在 Java 9 中已被弃用并在 Java 11 中被删除,我们必须添加一个额外的依赖项才能使用这些注解:

<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>

enter link description here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-25
    • 2018-05-06
    • 2018-05-10
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 2021-03-28
    • 2019-06-12
    相关资源
    最近更新 更多