初始化Java CDI而没有Weld吗?

时间:2019-06-18 14:21:18

标签: java dependency-injection cdi weld

如果我正确理解,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?

2 个答案:

答案 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
}