如果我正确理解,Java CDI应该独立于Weld。但是我看到的所有示例都使用Weld来初始化容器。
我试图在不使用Weld的情况下使用CDI,因为尽管我想使用DI,但是内存非常有限。
这是我的LoggerFactory的示例-
@ApplicationScoped
public class LoggerFactory {
@Produces
@Singleton
public Logger getLogger() {
return LogManager.getLogger("com.myapp");
}
}
我试图在Main中获取它
Logger logger = CDI.current().select(Logger.class).get();
这样做时,我得到Unable to locate CDIProvider
。
是否可以在没有其他库的情况下使用CDI?如何在这种情况下获取Logger?
答案 0 :(得分:4)
CDI是Java EE规范。它指定了应该如何做,但是它本身不提供功能。
Weld是CDI规范的参考实现。 CDI的替代实现是例如Apache OpenWebBeans。这些实现中的任何一个都将能够为您提供CDI的功能。
Weld提供了一个扩展,它将在Java SE中启动CDI bean管理器: https://docs.jboss.org/weld/reference/latest/en-US/html/environments.html#weld-se
但是要小心,因为根据我的经验,Weld SE占用大量内存,并且需要一些时间来扫描类路径(较大的SE-Applications)。
答案 1 :(得分:0)
实际上,从2.0版has a standard way to start a CDI container without requiring an application server开始的CDI。
final SeContainerInitializer initializer = SeContainerInitializer.newInstance();
// You can call various configuration methods on the initializer, including
// disableDiscovery(), which turns off all scanning behavior if that's a problem.
// You can programmatically add beans, extensions, etc.
try (final SeContainer container = initializer.initialize()) {
assert container != null;
// container is also an Instance<Object> so you can select() with it
}