您如何找到 CDI bean of/in 当前视图(范围)?
How do you find CDI beans of/in the current view (scope)?
在JavaEE 6、CDI 1.1.x、Seam 3等环境中,我们需要找到当前的所有CDI bean查看(@ViewScoped
)。到目前为止我尝试使用的是:
@Named
@ViewScoped
public class ViewHelper
{
@Inject
private BeanManager beanManager;
public doSomethingWithTheBeanInstances()
{
Set<Bean<?>> beans = this.getBeanManager().getBeans(
Object.class, new AnnotationLiteral<Any>(){}
);
// do something
...
}
}
但是,这个returns所有个bean它管理。
我只需要找到那些 在当前视图范围内的 并且 - 这将是理想的 - 只需要那些实现特定接口(继承多个层次结构级别)的.
有什么方法可以做到?
请注意,由于 CDI 没有视图范围,我们正在使用 Seam 3 来注释我们所有视图范围的 bean,例如:
@Named
@ViewScoped
public class ResultManagerColumnHandler extends BaseColumnHandler
{
....
}
以上是要查找的实例(@ViewScoped
是 Seam 3 的 CDI 替代品)。
如何做到?
我不熟悉 Seam,但从 CDI 的角度来看,这是我会尝试的。但是,请注意它 只有在 beanManager.getContext(ViewScoped.class);
returns 对您来说是一个有效的上下文实例时才有效 :
@Inject
BeanManager bm;
public List<Object> getAllViewScoped() {
List<Object> allBeans = new ArrayList<Object>();
Set<Bean<?>> beans = bm.getBeans(Object.class);
// NOTE - context has to be active when you try this
Context context = bm.getContext(ViewScoped.class);
for (Bean<?> bean : beans) {
Object instance = context.get(bean);
if (instance != null) {
allBeans.add(instance);
}
}
return allBeans;
}
您还要求只获取实现特定接口的bean。为此,只需修改代码行以检索具有所需类型的所有 bean:
Set<Bean<?>> beans = bm.getBeans(MyInterface.class);
在JavaEE 6、CDI 1.1.x、Seam 3等环境中,我们需要找到当前的所有CDI bean查看(@ViewScoped
)。到目前为止我尝试使用的是:
@Named
@ViewScoped
public class ViewHelper
{
@Inject
private BeanManager beanManager;
public doSomethingWithTheBeanInstances()
{
Set<Bean<?>> beans = this.getBeanManager().getBeans(
Object.class, new AnnotationLiteral<Any>(){}
);
// do something
...
}
}
但是,这个returns所有个bean它管理。
我只需要找到那些 在当前视图范围内的 并且 - 这将是理想的 - 只需要那些实现特定接口(继承多个层次结构级别)的.
有什么方法可以做到?
请注意,由于 CDI 没有视图范围,我们正在使用 Seam 3 来注释我们所有视图范围的 bean,例如:
@Named
@ViewScoped
public class ResultManagerColumnHandler extends BaseColumnHandler
{
....
}
以上是要查找的实例(@ViewScoped
是 Seam 3 的 CDI 替代品)。
如何做到?
我不熟悉 Seam,但从 CDI 的角度来看,这是我会尝试的。但是,请注意它 只有在 beanManager.getContext(ViewScoped.class);
returns 对您来说是一个有效的上下文实例时才有效 :
@Inject
BeanManager bm;
public List<Object> getAllViewScoped() {
List<Object> allBeans = new ArrayList<Object>();
Set<Bean<?>> beans = bm.getBeans(Object.class);
// NOTE - context has to be active when you try this
Context context = bm.getContext(ViewScoped.class);
for (Bean<?> bean : beans) {
Object instance = context.get(bean);
if (instance != null) {
allBeans.add(instance);
}
}
return allBeans;
}
您还要求只获取实现特定接口的bean。为此,只需修改代码行以检索具有所需类型的所有 bean:
Set<Bean<?>> beans = bm.getBeans(MyInterface.class);