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:

http://arquillian.org

这就完成了任务

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;
}