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:
为了解决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; }
- 将参数传递给@Inject Bean的实例
- 如何在CDI环境中管理EntityManager生命周期(使用Tomcat)
- EJB和CDI bean序列化的最佳实践
- 无法在自定义Apache Shiro AuthorizingRealm中@Inject我的DAO
- @Inject仅适用于CDI容器创建的POJO?
- 为什么具有分离数据源的不同持久性单元会查询相同的数据源?
- 在CDI中更大范围的bean实例中注入更短范围的Bean实例 – 它是如何工作的?
- 当打包为EAR时,是否可以在WAR内观察CDI事件
- 可以在JSR 330中使@Inject成为可选项(如@Autowire(required = false)吗?