初始化 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
}
如果我没理解错,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
}