[Java] BeanManager: Obtain Contextual Reference to Beans (TOTD #215)

原文はこちら。
https://blogs.oracle.com/arungupta/entry/beanmanager_obtain_contextual_reference_to

javax.enterprise.inject.spi.BeanManagerを使うと、Beanのコンテキストリファレンスをプログラムで取得できます。移植可能な拡張モジュールがコンテナと直接対話できるようにすることが主目的ではありますが、Java EEコンポーネントが利用することも可能です。

BeanManager:を取得する方法は3つあります。
  1. @Injectを使う
    @Inject BeanManager bm;
  2. getBeanManager()を使う
    BeanManager bm = CDI.current().getBeanManager();
  3. JNDI Lookupを使う
    BeanManager bm = null;
    try {
        InitialContext context = new InitialContext();
        bm = (BeanManager)context.lookup("java:comp/BeanManager");
    } catch (NamingException | NullPointerException ex) {
        Logger.getLogger(TestServlet.class.getName()).log(Level.SEVERE, null, ex);
        ex.printStackTrace(out);
    }
    
インスタンスはスコープが@Dependent 、修飾子が@Defaultになっています。これを使って、注入が可能なBeanのリストをプログラムで取得できます。例えば以下のような感じです。
Set<Bean<?>> beans = bm.getBeans(Greeting.class);
BeanManagerには他にも多くの有用なメソッドがあります。例えばコンテキストのリファレンスや注入可能なリファレンス、非コンテキストのインスタンスを取得するメソッドがあります。javadocを読んでみて下さい。
BeanManager (Java(TM) EE 7 Specification APIs)
http://docs.oracle.com/javaee/7/api/javax/enterprise/inject/spi/BeanManager.html
完全なサンプルソースコードは以下から入手できます。
glassfish~svn - Revision 62396: /branches/arun/javaee7-samples/samples/cdi/beanmanager
https://svn.java.net/svn/glassfish~svn/branches/arun/javaee7-samples/samples/cdi/beanmanager/
アプリケーションでどんなふうにBeanManagerを使いますか?

0 件のコメント:

コメントを投稿