внедрение зависимости (CDI) в Java EE 8 - PullRequest
0 голосов
/ 07 июня 2018

Я искал CDI для упрощения кода, и я пытался использовать его с Java EE 8. Я пытался воспроизвести существующий пример без успеха.Мне было интересно, не сталкивался ли кто-нибудь с такой же проблемой:

Класс PoolManager:

import javax.ejb.Startup;
import javax.ejb.Singleton;
import javax.annotation.PostConstruct;

@Singleton
@Startup
public class PoolManager {

    private Queue<Object> pooledObjects;

    @PostConstruct
    private void init() {
        System.out.println("Hi");
        pooledObjects = new LinkedBlockingQueue<Object>(1_000);
        for (int i = 0; i <= 1000; i++) {
            pooledObjects.offer(i);
        }   
    }


    public void returnObject(Object o) {
        pooledObjects.offer(o);
    }

    public Object borrowObject() {
        return pooledObjects.poll();
    }
}

Класс UsePoolManager:

public class UsePoolManager {

    @Inject 
    private PoolManager poolManager;

    public void usePooledObject() {
        Object object = this.poolManager.borrowObject();
        System.out.println(object);
    }

}

и Main:

public static void main(String[] args) {

        UsePoolManager user = new UsePoolManager();
        user.usePooledObject();
    }
}

Впрыск, похоже, не работает вообще во время выполнения.У меня нет бобов XML (я понимаю, что это не нужно, и добавление его ничего не изменило.).

Любая помощь будет принята с благодарностью.

Спасибо!


Проверка, использую ли я SE или EE для уточнения ...

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Для аргументации, используя контейнер CDI 2 для Java SE:

в Gradle:

// https://mvnrepository.com/artifact/org.jboss.weld.se/weld-se-core
compile group: 'org.jboss.weld.se', name: 'weld-se-core', version: '3.0.4.Final'

public class CDI2Fire {

    public static void main(String[] args)  {

        SeContainerInitializer initializer = 
                    SeContainerInitializer.newInstance();

            try (SeContainer container = initializer.disableDiscovery().addPackages(CDI2Fire.class).initialize()) {
                container.select(UsePoolManager.class);
            }
        }
    }

@ApplicationScoped
public class UsePoolManager {

    @Inject 
    private PoolManager poolManager;

    public void init(@Observes @Priority(Interceptor.Priority.APPLICATION - 100)
        @Initialized(ApplicationScoped.class) Object init) throws Exception{
        usePooledObject();
    }

    public void usePooledObject() {
        Object object = this.poolManager.borrowObject();
        System.out.println(object);
    }

}

@Singleton
@Startup
public class PoolManager {

    private Queue<Object> pooledObjects;

    @PostConstruct
    private void init() {
        System.out.println("Hi");
        pooledObjects = new LinkedBlockingQueue<Object>(1_000);
        for (int i = 0; i <= 1000; i++) {
            pooledObjects.offer(i);
        }   
    }


    public void returnObject(Object o) {
        pooledObjects.offer(o);
    }

    public Object borrowObject() {
        return pooledObjects.poll();
    }
}
0 голосов
/ 08 июня 2018

Относительно вашего собственного ответа: вы изменили полную логику приложения, переместив вызов бизнес-метода usePooledObject() в прослушиватель инициализации вместо вызова его вручную, как в исходном примере.

Это, вероятно, не самый лучшийидея, поскольку объекты, которые дико выполняются при произвольных событиях инициализации, очень трудно контролировать.

Таким образом: точка, которую вы, вероятно, пропустили, использует get() после select():

try (SeContainer ...) {
    // replaces the original "new":
    UsePoolManager user = CDI.current().select(UsePoolManager.class).get();
    user.usePooledObject();
}

Также обратите внимание, что использование CDI.current() устраняет необходимость иметь конкретную ссылку на контейнер в области видимости.Таким образом, вы можете использовать его везде в вашем приложении, пока контейнер активен.

0 голосов
/ 07 июня 2018

Вам необходимо запустить его в контейнере JavaEE, например, JBoss или Tomcat, а не в автономном приложении JavaSE (с publis static void main)

...