初始化 Java CDI 不焊接?

Initialize Java CDI Without Weld?

如果我没理解错,JavaCDI应该独立于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?在这种情况下如何获取我的记录器?

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 会消耗大量内存并且需要一些时间来扫描 class-path 以获得(更大的)SE-Applications。

实际上,CDI 从 2.0 版本开始 has a standard way to start a CDI container without requiring an application server

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
}