繁体   English   中英

在没有焊接的情况下初始化 Java CDI?

[英]Initialize Java CDI Without 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? 在这种情况下如何获取我的记录器?

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 应用程序的类路径。

实际上,从 2.0 版本开始,CDI 有一个标准的方式来启动一个 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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM