如何动态检索 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
我正在尝试为我的 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