Java EE 7 CDI手动实例化

我有一个带有@Inject注释字段的类。 我使用reflection实例化类,但我希望CDI注入实例以执行类实例字段。 有办法吗?

Object myInstanceWithDependecies = Class.forName(“com.package.MyClass").newInstance(); CDI.injectAll(myInstanceWithDependecies);//This is what i want 

有人知道怎么做吗? 如果有一种方法可以使用reflection扫描每个字段,我将不胜感激。

提前致谢。

这可以完成工作

SomeBean bean = CDI.current()。select(SomeBean.class).get();

此链接描述了如何在JavaSE应用程序中使用OpenWebBeans:

http://openwebbeans.apache.org/owbsetup_se.html

如果您想将它用于unit testing,我建议使用Arquillian:

http://arquillian.org

为了解决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提供您正在寻找的function。 在不包含DeltaSpike的情况下,也可以使用此代码片段(不依赖于其他DeltaSpike代码)。

 @SuppressWarnings("unchecked") public static  T injectFields(T instance) { if (instance == null) { return null; } BeanManager beanManager = CDI.current().getBeanManager(); CreationalContext creationalContext = beanManager.createCreationalContext(null); AnnotatedType annotatedType = beanManager.createAnnotatedType((Class) instance.getClass()); InjectionTarget injectionTarget = beanManager.createInjectionTarget(annotatedType); injectionTarget.inject(instance, creationalContext); return instance; }