Java™ Contexts and
Dependency Injection (JCDI) は、管理 Bean における依存性の注入をサポートします。
Web アプリケーションを JCDI 対応にすることにより、
@javax.inject.Inject アノテーション付きフィールドおよびプロパティー
を追加できます。アノテーション付きフィールドおよびプロパティーが有効な JCDI 管理 Bean を持つ
有効な注入ポイントである場合は、その依存性が実行時に解決されます。
依存性の注入は、コード内で、
Java タイプの新規インスタンスの作成と、
これらの Java タイプの使用とを分離します。
依存性の注入により、
コードのテストが容易になり、アプリケーションの管理も効率的になります。
このタスクについて
このタスクでは、beans.xml デプロイメント記述子を追加することにより、
JCDI を使用するようにアプリケーションを構成します。その後、実行時に解決される @javax.inject.Inject フィールドを持つ標準の Java API
for RESTful Web Services (JAX-RS) リソース・タイプを作成します。
以下に、JCDI 対応の、JAX-RS を使用した簡単な Web アプリケーションを作成する方法について説明します。
手順
- WEB-INF ディレクトリー内の Web アプリケーション (WAR) に beans.xml デプロイメント記述子を追加します。 これは、Web アプリケーションが JCDI 対応アプリケーションであることを示します。
WEB-INF/beans.xml ファイルがあるということは、
アーカイブが JCDI 対応のアーカイブであることを示しています。このタスクでは、
デプロイメント記述子に追加情報を追加する必要はありません。以下の例は、
基本的な WEB-INF/beans.xml ファイルを示しています。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/
XMLSchema-instance" xsi:schemeLocation="http://java.sun.com/xml/ns/javaee http://
java.sun.com/xml/ns/javaee/beans_1_0.xsd">
<!-- This is empty on purpose. -->
</beans>
- JAX-RS ルート・リソース・クラスを作成します。 以下の例は、簡単な JAX-RS ルート・リソース・クラスを示しています。
package com.example.jaxrs;
@javax.ws.rs.Path("exampleWithInjection")
public class StringResource {
public StringResource() {
/* use a no-argument constructor */
}
@javax.ws.rs.core.Context
private javax.ws.rs.core.HttpHeaders httpHeaders;
@javax.annotation.PostConstruct
private void myPostConstruct() {
/* read from the httpHeaders if required */
}
@javax.ws.rs.GET
@javax.ws.rs.Produces(javax.ws.rs.core.MediaType.TEXT_PLAIN)
public String get() {
return "Hello world!";
}
}
前のコードでは、引数がないコンストラクターが使用されています。
引数がないコンストラクターは、クラスを有効な JCDI Bean にする、有効な JCDI コンストラクターです。
オブジェクトのインスタンス生成時に JAX-RS コンテキスト・オブジェクトまたはパラメーター
を注入したい場合は、Bean プロパティーまたは Bean フィールドを使用できます。
オブジェクトの構成後に呼び出される @javax.annotation.PostConstruct アノテーション
付きメソッドを使用します。
- JCDI ライフサイクル・スコープを JAX-RS クラスに追加します。 以下の例は、@javax.enterprise.context.RequestScoped スコープ・アノテーション
を付けた JAX-RS ルート・リソース・クラスを示しています。
ベスト・プラクティス: @javax.enterprise.context.RequestScoped アノテーションをルート・リソース・クラスに追加して、JAX-RS ルート・リソース・クラスが要求ごとに固有のインスタンスを持つようにします。
これは、非 JCDI 対応アプリケーションではデフォルトの動作です。
bprac
package com.example.jaxrs;
@javax.ws.rs.Path("exampleWithInjection")
@javax.enterprise.context.RequestScoped
public class StringResource {
@javax.ws.rs.GET
@javax.ws.rs.Produces(javax.ws.rs.core.MediaType.TEXT_PLAIN)
public String get() {
return "Hello world!";
}
}
- JAX-RS ルート・リソースに注入されるクラスを作成します。 以下の例は、標準の Java クラスを示しています。
package com.example.jaxrs;
public class Data {
public String getData() {
return "Hello world!";
}
}
- JAX-RS ルート・リソースを変更して、com.example.jaxrs.Data タイプ用の @javax.inject.Inject アノテーション付きフィールドを追加します。 以下の例は、@javax.inject.Inject 注入ポイントを追加して
変更した JAX-RS ルート・リソース・クラスを示しています。
package com.example.jaxrs;
@javax.ws.rs.Path("exampleWithInjection")
@javax.enterprise.context.RequestScoped
public class StringResource {
@javax.ws.rs.GET
@javax.ws.rs.Produces(javax.ws.rs.core.MediaType.TEXT_PLAIN)
public String get() {
return myData.getData();
}
@javax.inject.Inject
private Data myData;
}
実行時に JAX-RS ルート・リソースが構成される際に、
Data タイプのインスタンスが myData フィールドに注入されます。これは注入の単純な形式ですが、JCDI は、より複雑なユース・ケースにも対応できます。詳しくは、
JCDI の仕様を参照してください。
- Servlet 3.0 web.xml ファイルを WAR ファイルに追加します。 以下の例では、すべての JAX-RS ルート・リソースを /rest/* URL パターンで
使用できるようにするデフォルトの JAX-RS アプリケーション・サーブレット定義が追加されています。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/
XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/
j2ee/web-app_3_0.xsd" version="3.0">
<servlet>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
タスクの結果
JCDI を使用するように Web アプリケーションを構成し、
JCDI ライフサイクル・スコープを使用した JAX-RS リソース、および標準の注入ポイントを作成しました。