【问题标题】:Initialize Java CDI Without Weld?在没有 Weld 的情况下初始化 Java CDI?
【发布时间】:2019-06-18 14:21:18
【问题描述】:

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

【问题讨论】:

    标签: java dependency-injection cdi weld


    【解决方案1】:

    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。

    【讨论】:

    • 这是有道理的。谢谢
    【解决方案2】:

    实际上,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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      • 2021-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多