【问题标题】:Can you inject in produced object in CDI?你可以在 CDI 中注入生成的对象吗?
【发布时间】:2014-06-29 12:08:38
【问题描述】:

假设我有,

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

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

但在My类型本身,我不能注入,例如,

public class My
    @Inject @Random private int randomNumber;

上面my 中的randomNumber 字段是null

所以我的问题是:你真的不能注入一个生成的对象,还是我做错了什么?

【问题讨论】:

  • 我也很好奇,你为什么不能用@Named注释My
  • @JohnAment,我知道,但我想看看这是否也有效。
  • 好的,那么我认为我提出的任何一个选项都应该适合你。

标签: dependency-injection cdi weld


【解决方案1】:

由于您手动实例化您的 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);

【讨论】:

    猜你喜欢
    • 2020-04-28
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多