你能在CDI注入生产对象吗?

时间:2014-06-29 12:08:38

标签: dependency-injection cdi weld

假设我有,

public class Ctrl{
        @Named @Produces public My getMy(){ return new My(); }

我可以在其中使用带有my的EL表达式。所以没关系。

但是在My类型中,我无法注入,例如,

public class My
    @Inject @Random private int randomNumber;

上面randomNumber中的my字段为null

所以我的问题是:你真的不能注入生产的物体,或者我做错了什么?

1 个答案:

答案 0 :(得分:3)

由于您手动实例化My类,因此它不会依赖注入。这是对的。

虽然有很多方法可以解决这个问题。如果你正在使用DeltaSpike,你可以使用BeanProvider.injectFields填充bean的注入点,然后再返回它。

如果您没有使用DeltaSpike,请在代码中设置一个峰值,看看您可以采取哪些措施来移植更改(https://github.com/apache/deltaspike/blob/master/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/provider/BeanProvider.java#L395):

BeanManager beanManager = ....; //however you get your bean manager.
CreationalContext creationalContext = beanManager.createCreationalContext(null);
AnnotatedType annotatedType = beanManager.createAnnotatedType(instance.getClass());
InjectionTarget injectionTarget = beanManager.createInjectionTarget(annotatedType);
injectionTarget.inject(instance, creationalContext);