当CDI注入POJO应该工作? (GlassFish v3) [英] When CDI injection into POJO should work? (GlassFish v3)

查看:181
本文介绍了当CDI注入POJO应该工作? (GlassFish v3)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

When I inject EJB 3.1 beans into POJO created by @Inject then injection works. When I construct POJO on my own then it doesn't (Glassfish v3). Is it correct behavior?

我的类(在EJB模块中):

My classes (in EJB module):

@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。

I'm using 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结构:

Unpacked EJB module jar structure:

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

是否正确行为?

推荐答案

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

The following part might be an answer to your question:

根据 CDI 1.0规范

3.7。 Bean构造函数


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

When the container instantiates a bean class, it calls the bean constructor. The bean constructor is a constructor of the bean class.

应用程序可以直接调用bean构造函数。但是,如果
应用程序直接实例化了bean ,那么,容器就不会将
的参数传递给构造函数;返回的对象不绑定
到任何上下文; 容器注入不依赖关系;和
,新实例的生命周期不受容器管理。

The application may call bean constructors directly. However, if the application directly instantiates the bean, no parameters are passed to the constructor by the container; the returned object is not bound to any context; no dependencies are injected by the container; and the lifecycle of the new instance is not managed by the container.

HTH!

这篇关于当CDI注入POJO应该工作? (GlassFish v3)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆