Seam 3 - 检索应用程序上下文中的所有seam组件

时间:2011-03-19 11:22:53

标签: seam seam3

有没有办法获得@ApplicationScoped的所有Seam 3组件类?

3 个答案:

答案 0 :(得分:2)

在阅读16.5. The Bean interface Weld documentation

的章节后,请不要尝试自己。
class ApplicationScopedBeans {
    @Inject BeanManager beanManager;

    public Set<Bean<?>> getApplicationScopedBeans() {
        Set<Bean<?>> allBeans = beanManager.getBeans(Object.class, new AnnotationLiteral<Any>() {});
        Set<Bean<?>> result = new HashSet<Bean<?>>();
        for(Bean<?> bean : allBeans) {
            if(bean.getScope().equals(ApplicationScoped.class)) {
                result.add(bean);
            }
        }
        return result;
    }
}

<强>更新

获取instance的{​​{1}}:

Bean

更新2

以上所有内容都错过了CDI的全部观点:)

public Object getApplicationScopedInstance(Bean<?> bean) {
    CreationalContext ctx = beanManager.createCreationalContext(bean);
    Context appCtx = beanManager.getContext(ApplicationScoped.class);
    return appCtx.get(bean, ctx);
}

答案 1 :(得分:1)

如果你想从applicationContext中的一个组件调用一个方法或者在其中使用一个字段,最好将它定义为生成器方法或字段并将其注入你想要的地方。

答案 2 :(得分:0)

您可以使用getApplicationContext()获取上下文,然后使用getNames()获取应用程序范围内所有内容的名称,然后使用get()按名称检索它们

你想做什么?从那里你必须使用反射来使它们成为正确的类型..

Context appContext = Contexts.getApplicationContext();
String [] names = appContext.getNames();
//Do whatever with them..
for(String s : names){
   Object x = appContext.get(name);
   // do something.
}