14. Servlet2.5 アノテーション
2007.08.10 株式会社四次元データ 小松一登
- 2.1. @Resource
- 2.2. @PostConstruct, @PreDestroy
- 2.3. アノテーション一覧
Java SEなどで提供されているアノテーションのいくつかが、サーブレットでも使えるようになりました。それらのアノテーションの振る舞いは、サーブレットでの利用を想定したものとしてServlet2.5仕様で規定されています。この章では今回追加されたアノテーションの紹介と、そのうちのいくつかを取り上げての解説を行います。
2.1. @Resource
それではまず、@Resourceアノテーションについて詳しく紹介します。@Resourceアノテーションでは、サーブレットコンテナに対しリソース注入の要求を行ってくれます。web.xmlの<resource-ref>要素や<env-ref>要素、<resource-env-ref>要素と同じ働きです。これにより、自分でJNDIルックアップを行ったり、web.xmlへのリソース宣言を行う必要がなくなります。
ここではApache Tomcat6を例にとって説明します。まず、サーバの設定ファイルであるserver.xmlにリソース宣言を行い、"jdbc/datasource"というJNDI名でリソースを登録しておきます。
これまでのJNDIルックアップによる方法では、さらにweb.xmlにリソース参照の設定をした上で、以下のようにルックアップを行いリソースを取得していました。(詳しくはこちら)
private DataSource ds; protected void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{ try{ Context context = new InitialContext(); ds = (DataSource) context.lookup("java:comp/env/jdbc/datasource"); }catch(Exception e){ ・・・ }
そして以下が、今回追加された@Resourceアノテーションを用いた例です。この場合、web.xmlにリソース参照を定義する必要はありません。
@Resource(name = "jdbc/datasource") private DataSource ds; protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException,IOException{ ・・・ }
name属性には、リソースのJNDI名を指定します。JNDIルックアップによる方法より、大分簡単な記述で済むようになりました。また、@Resourceアノテーションはサーブレットのほか、フィルタやリスナーでも使用可能です。
2.2. @PostConstruct, @PreDestroy
次に@PostConstructアノテーションと@PreDestroyアノテーションについて紹介します。@PostConstructアノテーションを付与したメソッドは、コンテナの初期化時にリソース注入が行われたあと、ライフサイクルメソッドが呼び出される前に実行されます。一方@PreDestroyアノテーションが付与されたメソッドは、コンテナの終了時、インスタンスが取り除かれる前に実行されます。そのメソッドではリソースの開放などを行うのが典型的でしょう。
2.3. アノテーション一覧
今回追加されたアノテーションは他にもあります。以下にその一覧を示します。
@Resource | コンテナに対しリソース注入の要求を行う。 |
@Resources | 複数のリソース注入を行うときに用いる。 |
@PostConstruct | コンテナの初期化時に実行させたいメソッドに付加する。 |
@PreDestroy | コンテナの終了時に実行させたいメソッドに付加する。 |
@DeclareRoles | セキュリティロールを宣言する。web.xmlの<security-role>要素と同じ。 |
@RunAs | クラス実行時のロールを宣言する。web.xmlの<run-as>要素と同じ。 |
@EJB | EJBの参照を宣言する。web.xmlの<ejb-ref>要素や<ejb-local-ref>要素と同じ。 |
@EJBs | EJB参照を複数宣言するときに用いる。 |
@PersistenceContext | EntityManagerの注入を行う。 |
@PersistenceContexts | 複数のEntityManager注入を行うときに用いる。 |
@PersistenceUnit | EntityManagerFactoryの注入を行う。 |
@PersistenceUnits | 複数のEntityManagerFactory注入を行うときに用いる。 |
@WebServiceRef | WebServiceの注入を行う。web.xmlの<resource-ref>要素と同じ。 |
@WebServiceRefs | 複数のWebService注入を行うときに用いる。 |
これらは現在Servlet2.5仕様にリストアップされているアノテーションであり、今後、利用可能なアノテーションがさらに追加される可能性もあります。これらアノテーションがサーブレットでも使えるようになったおかげで、開発がより楽になると期待できるでしょう。
次回は、web.xmlの構文変更について解説します。