获取运行时所有已初始化的@Named-beans 的列表
Get list all initialized @Named-beans on runtime
我使用 javax.inject.Named
和 javax.enterprise.context.*Scoped
加上 org.omnifaces.cdi.ViewScoped
来定义我的视图 beans 的生命范围。
现在我想获取所有实例化 bean 的列表。首先,我以为 this blog-entry 涵盖了这个问题,但它只列出了 @ManagedBeans
.
你知道如何列出它们吗?如果不固定在 JavaEE 的实现或什至版本上,这是否可能?
PS:我已经找到org.omnifaces.cdi.BeanStorage
,但我不知道如何访问它的地图。
鉴于您正在使用 OmniFaces,您可以使用 Beans#getActiveInstances()
method of the Beans
utility class 获取给定 CDI 范围内的所有活动实例。
Map<Object, String> activeViewScopedBeans = Beans.getActiveInstances(ViewScoped.class);
// ...
键是bean实例,值是bean名称。
对于技术感兴趣的人,这里是这个实用方法的concrete implementation:
public static <S extends Annotation> Map<Object, String> getActiveInstances(BeanManager beanManager, Class<S> scope) {
Map<Object, String> activeInstances = new HashMap<>();
Set<Bean<?>> beans = beanManager.getBeans(Object.class);
Context context = beanManager.getContext(scope);
for (Bean<?> bean : beans) {
Object instance = context.get(bean);
if (instance != null) {
activeInstances.put(instance, bean.getName());
}
}
return Collections.unmodifiableMap(activeInstances);
}
BeanStorage
仅供内部使用。此外,它未在 showcase.
中列出
我使用 javax.inject.Named
和 javax.enterprise.context.*Scoped
加上 org.omnifaces.cdi.ViewScoped
来定义我的视图 beans 的生命范围。
现在我想获取所有实例化 bean 的列表。首先,我以为 this blog-entry 涵盖了这个问题,但它只列出了 @ManagedBeans
.
你知道如何列出它们吗?如果不固定在 JavaEE 的实现或什至版本上,这是否可能?
PS:我已经找到org.omnifaces.cdi.BeanStorage
,但我不知道如何访问它的地图。
鉴于您正在使用 OmniFaces,您可以使用 Beans#getActiveInstances()
method of the Beans
utility class 获取给定 CDI 范围内的所有活动实例。
Map<Object, String> activeViewScopedBeans = Beans.getActiveInstances(ViewScoped.class);
// ...
键是bean实例,值是bean名称。
对于技术感兴趣的人,这里是这个实用方法的concrete implementation:
public static <S extends Annotation> Map<Object, String> getActiveInstances(BeanManager beanManager, Class<S> scope) {
Map<Object, String> activeInstances = new HashMap<>();
Set<Bean<?>> beans = beanManager.getBeans(Object.class);
Context context = beanManager.getContext(scope);
for (Bean<?> bean : beans) {
Object instance = context.get(bean);
if (instance != null) {
activeInstances.put(instance, bean.getName());
}
}
return Collections.unmodifiableMap(activeInstances);
}
BeanStorage
仅供内部使用。此外,它未在 showcase.