目次へ

14. Servlet2.5 アノテーション

2007.08.10 株式会社四次元データ 小松一登

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の構文変更について解説します。

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp