【问题标题】:Java EE 7 CDI Manual InstantiationJava EE 7 CDI 手动实例化
【发布时间】:2016-04-07 09:02:23
【问题描述】:

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

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

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

提前致谢。

【问题讨论】:

  • CDI 确实有文档,此时您会阅读有关生产者方法的信息:docs.oracle.com/javaee/6/tutorial/doc/gjdid.html
  • 您希望它用于编写 JUnit 测试还是出于其他原因?
  • 我知道它有一个文档,我去过那里并且我已经阅读过它。问题是你没有理解我的问题。我知道生产者方法和领域。他们不帮我解决我的问题。我正在自己实例化课程。你看不出我正在实例化的类是动态的吗?我需要一种调用 CDI 并告诉它对我的对象实例进行注入的方法。
  • 我认为this 是您要找的。​​span>

标签: java jakarta-ee cdi


【解决方案1】:

这样就完成了工作

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

【讨论】:

    【解决方案2】:

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

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

    如果你想将它用于单元测试,我建议使用 Arquillian:

    http://arquillian.org

    【讨论】:

      【解决方案3】:

      为了解决 CDI 依赖关系,您的 com.package.MyClass 实例必须是托管 bean(由容器实例化),否则无法让容器解决其依赖关系。

      要解决您的问题,您可以在不自己创建实例的情况下进行编程查找:

      CDI.current().select(Class.forName("com.package.MyClass")).get() 
      //remember to check for ambiguous or unsatisfied dependency
      

      【讨论】:

        【解决方案4】:

        如果您的 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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-05
          • 1970-01-01
          • 1970-01-01
          • 2013-11-26
          • 2014-04-27
          • 2020-11-27
          • 2011-10-15
          • 2017-01-09
          相关资源
          最近更新 更多