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