これを知っていると、DIできないコンポーネントでManagedBeanを利用(例えば、JSFやJSPのスクリプトレット内)できたりします。
例として、以下のようなManagedBeanがあったとします。
package sample; import java.util.Date; import javax.enterprise.context.RequestScoped; import javax.inject.Named; @RequestScoped @Named("test1") public class TestBean1 { public Date getDate() { return new Date(); } }
これを以下のように取得する。
InitialContext ic = new InitialContext(); BeanManager manager = (BeanManager)ic.lookup("java:comp/BeanManager"); Set<Bean<?>> beans = manager.getBeans( TestBean1.class, new AnnotationLiteral<Default>() {}); Bean<?> bean = manager.resolve(beans); TestBean1 obj = (TestBean1)manager.getReference( bean, TestBean1.class, manager.createCreationalContext(bean));
9行目のresolveは、5行目でBeanが1つに絞られているからできるのであり、もし絞られていないようであれば、5行目で取得したSet<Bean<?>>をQualifierやNameから要求にあったBeanを取得してgetReferenceを行えば良いです。
また、EL名で取得したい場合は、5行目を
Set<Bean<?>> beans = manager.getBeans("test1");のようにすれば良いです。
0 件のコメント:
コメントを投稿