如何动态检索CDI依赖?

时间:2016-01-27 13:45:46

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

我正在尝试动态检索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。

2 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分:1)

我为我的一个项目创建的简单ManualContext类的

Here is the source code。它主要用于从POJO对象访问CDI托管bean,但它可能对您有所帮助。

使用示例:

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