Java EE 7 CDI 手动实例化
Java EE 7 CDI Manual Instantiation
我有一个 Class,其中的字段用 @Inject 注释。我使用反射实例化 Class,但我希望 CDI 注入实例来执行 Class 实例字段。有办法吗?
Object myInstanceWithDependecies = Class.forName(“com.package.MyClass").newInstance();
CDI.injectAll(myInstanceWithDependecies);//This is what i want
有人知道怎么做吗?如果有一种无需使用反射扫描每个字段的方法,我将不胜感激。
提前致谢。
此 link 描述了如何在 JavaSE 应用程序中使用 OpenWebBeans:
http://openwebbeans.apache.org/owbsetup_se.html
如果你想将它用于单元测试,我建议使用 Arquillian:
这就完成了任务
SomeBean bean = CDI.current().select(SomeBean.class).get();
为了解决 CDI 依赖关系,您的 com.package.MyClass
实例必须是托管 bean(由容器实例化),否则无法让容器解决其依赖关系。
要解决您的问题,您可以在不自己创建实例的情况下进行编程查找:
CDI.current().select(Class.forName("com.package.MyClass")).get()
//remember to check for ambiguous or unsatisfied dependency
如果您的 com.package.MyClass
不是由 CDI 管理的,标准 CDI 不可能像其他人指出的那样注入依赖项。
但是,所有基础设施都可用。 DeltaSpike 提供您正在寻找的功能。也可以在不包含 DeltaSpike 的情况下使用此代码片段(不依赖于其他 DeltaSpike 代码)。
@SuppressWarnings("unchecked")
public static <T> T injectFields(T instance) {
if (instance == null) {
return null;
}
BeanManager beanManager = CDI.current().getBeanManager();
CreationalContext<T> creationalContext = beanManager.createCreationalContext(null);
AnnotatedType<T> annotatedType =
beanManager.createAnnotatedType((Class<T>) instance.getClass());
InjectionTarget<T> injectionTarget = beanManager.createInjectionTarget(annotatedType);
injectionTarget.inject(instance, creationalContext);
return instance;
}
我有一个 Class,其中的字段用 @Inject 注释。我使用反射实例化 Class,但我希望 CDI 注入实例来执行 Class 实例字段。有办法吗?
Object myInstanceWithDependecies = Class.forName(“com.package.MyClass").newInstance();
CDI.injectAll(myInstanceWithDependecies);//This is what i want
有人知道怎么做吗?如果有一种无需使用反射扫描每个字段的方法,我将不胜感激。
提前致谢。
此 link 描述了如何在 JavaSE 应用程序中使用 OpenWebBeans:
http://openwebbeans.apache.org/owbsetup_se.html
如果你想将它用于单元测试,我建议使用 Arquillian:
这就完成了任务
SomeBean bean = CDI.current().select(SomeBean.class).get();
为了解决 CDI 依赖关系,您的 com.package.MyClass
实例必须是托管 bean(由容器实例化),否则无法让容器解决其依赖关系。
要解决您的问题,您可以在不自己创建实例的情况下进行编程查找:
CDI.current().select(Class.forName("com.package.MyClass")).get()
//remember to check for ambiguous or unsatisfied dependency
如果您的 com.package.MyClass
不是由 CDI 管理的,标准 CDI 不可能像其他人指出的那样注入依赖项。
但是,所有基础设施都可用。 DeltaSpike 提供您正在寻找的功能。也可以在不包含 DeltaSpike 的情况下使用此代码片段(不依赖于其他 DeltaSpike 代码)。
@SuppressWarnings("unchecked")
public static <T> T injectFields(T instance) {
if (instance == null) {
return null;
}
BeanManager beanManager = CDI.current().getBeanManager();
CreationalContext<T> creationalContext = beanManager.createCreationalContext(null);
AnnotatedType<T> annotatedType =
beanManager.createAnnotatedType((Class<T>) instance.getClass());
InjectionTarget<T> injectionTarget = beanManager.createInjectionTarget(annotatedType);
injectionTarget.inject(instance, creationalContext);
return instance;
}