【问题标题】:Can @Inject be used in a pojo@Inject 可以在 pojo 中使用吗
【发布时间】:2016-02-02 06:50:53
【问题描述】:

我正在尝试使用和理解 CDI,当我在一个简单的 pojo 类中使用 @Inject 时,它会抛出 NPE。

示例 Greeting.java

public Class Greeting {
 public String greet() {
   System.out.println("Hello");
 }
}

Test.java

 import javax.inject.Inject;
 public class Test {
   @Inject 
   private Greeting greeting;

   public void testGreet() {
    greeting.testGreet();
   }
}

当我调用 testGreet() 时它会抛出 NPE,为什么问候实例为空。 @Inject 添加依赖的方式是否仅用于容器管理的bean? 注意:jar 不是这里的问题。

【问题讨论】:

  • 您可以注入 POJO,但要注入的类必须由容器管理(以便在实例化时让容器知道他必须填写 @Inject-annotated 字段)。
  • 在其他地方你必须有方法返回带有@Produres 注释的问候

标签: java cdi java-ee-6


【解决方案1】:

您的类应该从 Serializable 实现,以便作为“CDI Bean”注入

【讨论】:

    【解决方案2】:

    TL;DR: @Inject-annotated 字段仅为容器实例化的 bean 填充。

    长版: CDI 容器为您提供了许多实用程序,可以轻松地将依赖项注入到您的 bean 中,但它并不能凭空发挥作用。如果客户端 bean 本身由容器实例化,则容器只能填充客户端 bean 的注释字段。当容器实例化对象时,事件顺序如下:

    1. bean 的构造函数被调用。
    2. @Inject 注释字段(以及其他一些 注释,例如@PersistenceContext 和@EJB)是 人口稠密。
    3. @PostConstruct-annotated no-args 方法被调用。
    4. 你的 bean 完成了。

    您面临一个经典的引导问题,即如何从非容器管理的代码转移到容器管理的代码。您的选择是:

    1. 通过 JNDI 查找从 JavaEE 容器中访问 BeanManager 实例。这是技术性的,有点笨拙。
    2. 使用 CDI 扩展库,例如 Apache DeltaSpike。 (例如:BeanProvider.getContextualReference(Test.class, false);
    3. 修改您的应用程序以在您可以注入测试类而不是调用new Test(); 的情况下启动。这可以通过设置一个启动单例 ejb 来完成,它在 @PostConstruct 注释的初始化中调用您的测试。

    希望这会有所帮助。

    【讨论】:

    • 在任何情况下使用 DeltaSpike 都是一个好主意!
    【解决方案3】:

    您需要一个 JavaEE 容器,并且需要将 Greeting 和 Test 定义为托管 bean。之后,您可以将一个注入另一个。

    试着看看: https://docs.oracle.com/javaee/6/tutorial/doc/girch.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 2019-08-09
      • 2015-05-24
      • 1970-01-01
      • 2016-10-17
      • 2013-10-29
      • 1970-01-01
      相关资源
      最近更新 更多