首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >java EE 8中的依赖项注入(CDI)

java EE 8中的依赖项注入(CDI)
EN

Stack Overflow用户
提问于 2018-06-08 01:52:50
回答 3查看 883关注 0票数 0

我一直在研究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);
    }

}

主要的是:

public static void main(String[] args) {

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

在运行时,注入似乎根本不起作用。我没有beans (我知道这不是必需的,添加它也不会改变任何事情)。

任何帮助都将不胜感激。

谢谢!

正在检查我是使用SE还是EE进行澄清...

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-08 04:05:20

您需要在像JBoss或Tomcat这样的JavaEE容器中运行它,而不是像独立的JavaSE应用程序(使用publis static void main)那样运行。

票数 0
EN

Stack Overflow用户

发布于 2018-06-08 05:42:34

为了便于论证,我们使用用于Java SE的CDI 2容器:

在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
EN

Stack Overflow用户

发布于 2018-06-08 13:44:37

关于您自己的答案:您更改了完整的应用程序逻辑,方法是将业务方法调用usePooledObject()移动到初始化侦听器中,而不是像原始示例中那样手动调用它。

这可能不是最好的想法,因为在任意初始化事件上疯狂运行的对象很难控制。

因此:您可能遗漏的一点是,在select()之后使用get()

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

还要注意的是,使用CDI.current()消除了在作用域中使用具体容器引用的必要性。因此,只要容器处于活动状态,您就可以在应用程序中的任何地方使用它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50747388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档