「CDIメモ」の版間の差分

提供:Software Development Memo
ナビゲーションに移動 検索に移動
(ページの作成: {{Stub}} Category:ソフトウェア開発 Category:Java JSR 299で定義されているCDIのサンプルコードです。CDIに関する日本語のドキュメン...)
 
 
(同じ利用者による、間の3版が非表示)
8行目: 8行目:


* GlassFish : 3.1.2
* GlassFish : 3.1.2
* OS : Windows 8
* Java : 1.6


== シンプルなCDIサンプル ==
== シンプルなCDIサンプル ==
74行目: 76行目:


サーブレット初回コール時に、CdiTestのコンストラクタが呼ばれ、インスタンスが使い回しされます。
サーブレット初回コール時に、CdiTestのコンストラクタが呼ばれ、インスタンスが使い回しされます。
== @Produces を使用したサンプル ==
@Produces アノテーションを使用すると、インスタンスを取得するためのメソッドを指定できます。
=== サンプルコード ===
<source lang="java">
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();
}
}
</source>
CdiTest クラスには @Any アノテーションを付与します。
<source lang="java">
package tmp;
import javax.enterprise.inject.Any;
@Any
public class CdiTest {
public CdiTest() {
System.out.println("init.");
}
public void hello() {
System.out.println("hello.");
}
}
</source>
=== 実行結果 ===
<source lang="text">
情報: 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.
情報: hello.
情報: hello.
情報: hello.
</source>


== 更新履歴 ==
== 更新履歴 ==


* 仮ページ作成 -- 2013年6月30日 (日) 01:51 (JST)
* 仮ページ作成 -- 2013年6月30日 (日) 01:51 (JST)

2013年6月29日 (土) 17:13時点における最新版

注意 : このページ「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)