Шов 3 - получить все компоненты шва в контексте приложения - PullRequest
1 голос
/ 19 марта 2011

есть ли способ получить все классы компонентов Seam 3, которые @ApplicationScoped?

Ответы [ 3 ]

2 голосов
/ 10 июля 2011

Сам не пробовал, только предположение после прочтения 16.5. The Bean interface главы Сварки документации

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 из Bean:

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

ОБНОВЛЕНИЕ 2

Похоже, все вышеперечисленное пропускает весь смысл CDI:)

class ApplicationScopedBeans {
    @Inject @ApplicationScoped Instance<Object> appScopedBeans;

}
1 голос
/ 10 июля 2011

если вы хотите вызвать метод из компонента в applicationContext или использовать поле в этом, лучше, чтобы вы определили его как метод или поле производителя и вставили его там, где хотите.

0 голосов
/ 19 марта 2011

Вы бы использовали 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.
}
...