【问题标题】:When CDI injection into POJO should work? (GlassFish v3)何时将 CDI 注入 POJO 应该起作用? (玻璃鱼 v3)
【发布时间】:2011-11-17 11:01:01
【问题描述】:

当我将 EJB 3.1 bean 注入到由 @Inject 创建的 POJO 中时,注入就会起作用。当我自己构建 POJO 时,它不会(Glassfish v3)。这是正确的行为吗?

我的课程(在 EJB 模块中):

@Singleton
@LocalBean
@Startup
@Named
public class NewSingletonBean {

    @PostConstruct
    public void init(){
        System.out.println("NewSingletonBean INIT");
    }

}

_

public class MyPOJO {
        @Inject NewSingletonBean newSingletonBean;

        public void sth(){
            System.out.println("EJB injected into POJO: " + (newSingletonBean != null));
        }
}

不起作用

@Singleton
@LocalBean
@Startup
@DependsOn(value="NewSingletonBean")
public class NewSingletonBean2 {

    @Inject NewSingletonBean newSingletonBean;

    @PostConstruct
    public void init(){
        System.out.println("NewSingletonBean2 INIT");
        System.out.println("EJB injected into EJB: " + (newSingletonBean != null));
        MyPOJO p = new MyPOJO();
        p.sth();
    }

}

_

工作正常

@Singleton
@LocalBean
@Startup
@DependsOn(value="NewSingletonBean")
public class NewSingletonBean2 {

    @Inject NewSingletonBean newSingletonBean;
    @Inject MyPOJO p;
    @PostConstruct
    public void init(){
        System.out.println("NewSingletonBean2 INIT");
        System.out.println("EJB injected into EJB: " + (newSingletonBean != null));
        p.sth();
    }

}

我使用的是 NetBeans 7.0.1。

dist目录结构:

│   CDITest.ear
│
└───gfdeploy
    └───CDITest
        ├───CDITest-ejb_jar
        │   │   .netbeans_automatic_build
        │   │   .netbeans_update_resources
        │   │
        │   ├───META-INF
        │   │       beans.xml
        │   │       MANIFEST.MF
        │   │
        │   └───tries
        │           MyPOJO.class
        │           NewSingletonBean.class
        │           NewSingletonBean2.class
        │
        ├───CDITest-war_war
        │   │   index.jsp
        │   │
        │   ├───META-INF
        │   │       MANIFEST.MF
        │   │
        │   └───WEB-INF
        │       └───classes
        │               .netbeans_automatic_build
        │               .netbeans_update_resources
        │
        └───META-INF
                MANIFEST.MF

解压 EAR 结构:

│   CDITest-ejb.jar
│   CDITest-war.war
│
└───META-INF
        MANIFEST.MF

解压后的 EJB 模块 jar 结构:

├───META-INF
│       beans.xml
│       MANIFEST.MF
│
└───tries
        MyPOJO.class
        NewSingletonBean.class
        NewSingletonBean2.class

这是正确的行为吗?

【问题讨论】:

  • 我猜你已经在 cmets 中向你之前的问题询问过这个问题:stackoverflow.com/questions/8165482/…
  • 是的,但这是 cmets 中的问题,所以不是完整的 stackoverflow 问题。

标签: java glassfish ejb cdi ejb-3.1


【解决方案1】:

以下部分可能是您问题的答案:

根据CDI 1.0 specification

3.7. Bean 构造函数

当容器实例化一个 bean 类时,它会调用 bean 构造函数。 bean构造函数是bean类的构造函数。

应用程序可以直接调用 bean 构造函数。但是,如果 应用直接实例化bean,不传参数 通过容器传递给构造函数;返回的对象未绑定 在任何情况下; 容器不会注入任何依赖项;和 新实例的生命周期不由容器管理。

HTH!

【讨论】:

    【解决方案2】:

    这是正确的行为,因为 DI 仅适用于容器管理的 bean,而不适用于您自己创建的那些。

    【讨论】:

    • 你确定吗?你能引用规范或某事吗?
    猜你喜欢
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 2013-03-15
    相关资源
    最近更新 更多