我一直在研究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进行澄清...
发布于 2018-06-08 04:05:20
您需要在像JBoss或Tomcat这样的JavaEE容器中运行它,而不是像独立的JavaSE应用程序(使用publis static void main
)那样运行。
发布于 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();
}
}
发布于 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()
消除了在作用域中使用具体容器引用的必要性。因此,只要容器处于活动状态,您就可以在应用程序中的任何地方使用它。
https://stackoverflow.com/questions/50747388
复制相似问题