如何动态检索 CDI 依赖项?

How to dynamically retrieve a CDI dependency?

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

我知道 class 名称,但我想使用容器管理的实例,并解决适当的间接依赖关系。

例如:

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。

你可以这样做:

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

Here is the source code 我为我的一个项目创建的简单 ManualContext class。它主要是为从 POJO 对象访问 CDI-managed bean 而设计的,但也许它对您有所帮助。

使用示例:

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