Когда CDI инъекция в POJO должна работать?(GlassFish v3) - PullRequest
4 голосов
/ 17 ноября 2011

Когда я внедряю EJB 3.1 bean-компоненты в POJO, созданный @Inject, тогда инъекция работает.Когда я создаю 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 модуля:

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

Правильно ли этоповедение?

Ответы [ 2 ]

11 голосов
/ 17 ноября 2011

Следующая часть может быть ответом на ваш вопрос:

Согласно спецификации CDI 1.0 :

3,7. Бобовые конструкторы

Когда контейнер создает экземпляр класса bean, он вызывает компонент конструктор . Конструктор бина является конструктором класса бина.

Приложение может вызывать конструкторы бинов напрямую. Однако , если приложение непосредственно создает экземпляр компонента , параметры не передаются конструктору контейнером; возвращенный объект не связан в любом контексте; контейнер не вводит никаких зависимостей ; а также Контейнер не управляет жизненным циклом нового экземпляра.

НТН!

4 голосов
/ 17 ноября 2011

Это правильное поведение, потому что DI работает только для bean-компонентов, управляемых контейнером, а не для тех, которые вы создали сами.

...