【问题标题】:How to dynamically retrieve a CDI dependency?如何动态检索 CDI 依赖项?
【发布时间】:2016-05-04 12:09:01
【问题描述】:

我正在尝试动态检索我的 Java 代码的依赖项。

我知道类名,但我想获取容器管理的实例,并解决适当的间接依赖关系。

例如:

class Foo {

    public static void foo() {
        Bar bar = (Bar) getDependency("com.example.Bar");
        bar.bar();
    }

}

class Bar {

     @Inject
     private Spam spam;

     public void bar() {
         spam.spam();
     }

}

我自己无法构造Bar 实例,因为我无法注入正确的Spam。所以我希望Foo 向其中注入了Bar。我无法添加像 @Inject Bar bar 这样的字段,因为依赖项的确切名称在运行时会有所不同。

有什么办法吗?

我正在使用 WildFly 8.2.0。

【问题讨论】:

  • “因为依赖的确切名称在运行时会有所不同。” 什么意思?类型可能会有所不同?如果是这样,那么可以注入的类可以实现相同的接口,那么您可以创建@Qualifier,每个类的值都是唯一的,@Inject 所需的实现作为接口。能派上用场的是:Instance接口或@Produces注解。
  • 没错。类型不同。我将对所有这些都使用一个通用接口。问题是我需要运行时信息来知道要使用哪个“限定符”。我不能说静态使用哪个依赖项。
  • 假设你有类 AB@MyImpl 限定符有 String 值。您使用@MyImpl(value = "A") 注释类A,B 也是如此。当您使用Instance 接口时,您可以使用select 方法来查找您的实现。如果您希望注入 A 类,您可以说:“给我带有 @MyImpl 限定符和“A”值的类对象”。然后将注入A 类。 “A”值可能是在运行时变化的变量。 docs.jboss.org/weld/reference/latest/en-US/html/…

标签: java dependency-injection cdi wildfly-8 inject


【解决方案1】:

你可以这样做:

public class Foo {

    @Inject BeanManager beanManager;

    public void foo() {
        Set<Bean<?>> beans = beanManager.getBeans(Bar.class);
        Bean<?> bean = beanManager.resolve(beans);
        CreationalContext<?> creationalContext = beanManager.createCreationalContext(bean);
        Bar bar = (Bar) beanManager.getReference(bean, Bar.class, creationalContext);   
    }
}

或者甚至更简单:

public class Foo {

    @Inject Instance<Object> instance;

    public void foo() {
        Bar bar = instance.select(Bar.class).get();
    }
}

【讨论】:

    【解决方案2】:

    Here is the source code 属于我为我的一个项目创建的简单 ManualContext 类。它主要设计用于从 POJO 对象访问 CDI 管理的 bean,但它可能对您有所帮助。

    使用示例:

    final ManualContext mCtx = new ManualContext();
    ...
    final MyBean myBean = mCtx.lookupCDI(MyBean.class);  // obtains the CDI-managed instance
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-04
      • 2020-08-02
      • 1970-01-01
      • 2020-12-13
      • 1970-01-01
      • 2016-10-11
      • 2012-04-28
      • 2017-05-11
      相关资源
      最近更新 更多