CDIメモ
ナビゲーションに移動
検索に移動
注意 : このページ「CDIメモ」は、現在書きかけの状態です。完成版に向けて、今後加筆・修正します。また、本ページの内容は全体的な整合性が取れていない可能性があります。 |
JSR 299で定義されているCDIのサンプルコードです。CDIに関する日本語のドキュメントが無いので、作成してみようと思った次第です。
環境
- GlassFish : 3.1.2
- OS : Windows 8
- Java : 1.6
シンプルなCDIサンプル
呼び出し側
package tmp;
import java.io.IOException;
import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/Main00")
public class Main00 extends HttpServlet {
@Inject
private CdiTest cdi;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
cdi.hello();
}
}
Injectionクラス
package tmp;
public class CdiTest {
public CdiTest() {
System.out.println("init.");
}
public void hello() {
System.out.println("hello.");
}
}
実行結果
以下、ブラウザでサーブレットを複数回呼び出したときのログです。
情報: init.
情報: hello.
情報: hello.
情報: hello.
情報: hello.
サーブレット初回コール時に、CdiTestのコンストラクタが呼ばれ、インスタンスが使い回しされます。
@Produces を使用したサンプル
@Produces アノテーションを使用すると、インスタンスを取得するためのメソッドを指定できます。
サンプルコード
package tmp;
import javax.enterprise.inject.Produces;
public class Producer {
@Produces
public static CdiTest getCdiTest() {
System.out.println("factory method has called.");
return new CdiTest();
}
}
CdiTest クラスには @Any アノテーションを付与します。
package tmp;
import javax.enterprise.inject.Any;
@Any
public class CdiTest {
public CdiTest() {
System.out.println("init.");
}
public void hello() {
System.out.println("hello.");
}
}
実行結果
情報: factory method has called.
情報: init.
情報: hello.
情報: hello.
情報: hello.
@Qualifier を使用してインジェクションを行うメソッドを指定
@Qualifier アノテーションを付与したアノテーションを定義することで、インジェクションを行うメソッドを指定することができます。
サンプルコード
アノテーション @A01 を作成します。
package tmp;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.PARAMETER;
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface A01 {}
次に、アノテーション @A02 を作成します。
package tmp;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.PARAMETER;
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface A02 {}
作成したアノテーション @A01 と @A02 を使用して、オブジェクトの初期化方法を定義する。
package tmp;
import javax.enterprise.inject.Produces;
public class Producer {
@Produces @A01
public static CdiTest getCdiTest() {
System.out.println("A01");
return new CdiTest();
}
@Produces @A02
public static CdiTest getCdiTest2() {
System.out.println("A02");
return new CdiTest();
}
}
インジェクションをする例、@Inject @A01 と指定することで、Producer#getCdiTest が呼ばれるようになります。
package tmp;
import java.io.IOException;
import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/Main00")
public class Main00 extends HttpServlet {
@Inject @A01
private CdiTest cdi;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
cdi.hello();
}
}
実行結果
情報: A01
情報: init.
情報: hello.
情報: hello.
情報: hello.
更新履歴
- 仮ページ作成 -- 2013年6月30日 (日) 01:51 (JST)