「CDIメモ」の版間の差分
ナビゲーションに移動
検索に移動
(→更新履歴) |
(→実行結果) |
||
122行目: | 122行目: | ||
<source lang="text"> | <source lang="text"> | ||
情報: factory method has called. | 情報: factory method has called. | ||
情報: init. | |||
情報: hello. | |||
情報: hello. | |||
情報: hello. | |||
</source> | |||
== @Qualifier を使用してインジェクションを行うメソッドを指定 == | |||
@Qualifier アノテーションを付与したアノテーションを定義することで、インジェクションを行うメソッドを指定することができます。 | |||
== サンプルコード == | |||
アノテーション @A01 を作成します。 | |||
<source lang="java"> | |||
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 {} | |||
</source> | |||
次に、アノテーション @A02 を作成します。 | |||
<source lang="java"> | |||
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 {} | |||
</source> | |||
作成したアノテーション @A01 と @A02 を使用して、オブジェクトの初期化方法を定義する。 | |||
<source lang="java"> | |||
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(); | |||
} | |||
} | |||
</source> | |||
インジェクションをする例、@Inject @A01 と指定することで、Producer#getCdiTest が呼ばれるようになります。 | |||
<source lang="java"> | |||
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(); | |||
} | |||
} | |||
</source> | |||
=== 実行結果 === | |||
<source lang="text"> | |||
情報: A01 | |||
情報: init. | 情報: init. | ||
情報: hello. | 情報: hello. |
2013年6月29日 (土) 17:11時点における版
注意 : このページ「CDIメモ」は、現在書きかけの状態です。完成版に向けて、今後加筆・修正します。また、本ページの内容は全体的な整合性が取れていない可能性があります。 |
JSR 299で定義されているCDIのサンプルコードです。CDIに関する日本語のドキュメントが無いので、作成してみようと思った次第です。
環境
- GlassFish : 3.1.2
シンプルな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)