Spring Bean の定義
目次
アプリケーションのバックボーンを形成するのは、Spring IoC コンテナによって管理される Bean と呼ばれるオブジェクトです。Bean は Spring IoC コンテナによってインスタンス化され、アセンブルされ、オブジェクトが管理されます。これらの Bean は、たとえば XML <bean/> 定義でコンテナによって提供されます。これは、前の章で説明したように、構成メタデータの形式で作成されます。
Bean 定義には、コンテナーが認識する必要がある構成メタデータと呼ばれる次の情報が含まれています。
-
Beanの作成方法
-
Bean のライフサイクルの詳細
-
Bean の依存関係
上記の構成メタデータはすべて、各 Bean の定義を構成する次のプロパティのセットに変換されます。
属性 | 説明する |
---|---|
クラス | この属性は必須で、Bean の作成に使用される Bean クラスを指定します。 |
名前 | このプロパティは、一意の Bean 識別子を指定します。XML ベースのメタデータを構成する場合、id 属性や name 属性を使用して Bean 識別子を指定できます。 |
範囲 | このプロパティは、作成する特定の Bean 定義を指定します。これは、この章で説明するオブジェクトの Bean スコープ内にあります。 |
コンストラクター引数 | これは依存関係を挿入するために使用され、次のセクションで説明します。 |
プロパティ | これは依存関係を挿入するために使用され、次のセクションで説明します。 |
自動配線モード | これは依存関係を挿入するために使用され、次のセクションで説明します。 |
遅延初期化モード | 遅延初期化 Bean は、起動時ではなく、最初に Bean インスタンスを要求したときに、IoC コンテナに Bean インスタンスを作成するように指示します。 |
初期化メソッド | コールバックは、Bean の必要なプロパティをすべて取得した後に設定されたコンテナを呼び出すだけです。これについては、Bean のライフサイクルの章で説明します。 |
破壊方法 | 含まれている Bean コンテナが破棄されるときに使用されるコールバック。これについては、Bean のライフサイクルの章で説明します。 |
Spring 構成メタデータ
Spring IoC コンテナは、構成メタデータが実際に書き込まれる形式から完全に切り離されています。メタデータを構成するために Spring コンテナーによって提供される 3 つの重要なメソッドがあります。
-
XMLベースの設定ファイル。
-
アノテーションベースの構成
-
Javaベースの構成
XML ベースの構成メタデータがどのようにコンテナに提供されるかについてはすでに説明しましたが、XML 構成ファイルに基づく遅延初期化、初期化メソッド、破棄メソッドなど、さまざまな Bean 定義の別の例を見てみましょう。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- A simple bean definition -->
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- A bean definition with lazy init set on -->
<bean id="..." class="..." lazy-init="true">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- A bean definition with initialization method -->
<bean id="..." class="..." init-method="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- A bean definition with destruction method -->
<bean id="..." class="..." destroy-method="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>
注釈ベースの構成については、別の章で説明します。注釈付きの依存性注入を使用したプログラミングを開始する前に、他の重要な Spring 概念をいくつかマスターしたいと考えているため、意図的に別の章にまとめました。
Spring Bean スコープ
Spring <bean> を定義するときは、Bean スコープのオプションを宣言する必要があります。たとえば、Spring に新しい Bean インスタンスを強制的に生成するには、Bean のスコープ属性をプロトタイプとして宣言する必要があります。Spring が毎回同じ Bean インスタンスを返すようにしたい場合は、プロパティがシングルトンであるのと同じ方法で Bean のスコープを宣言する必要があります。
Spring フレームワークは次の 5 つのスコープをサポートしており、そのうちの 3 つは Web 対応の ApplicationContext を使用する場合にのみ使用できます。
範囲 | 説明する |
---|---|
シングルトン | これにより、Bean 定義の範囲が Spring IoC コンテナごとに 1 つのインスタンスに限定されます (デフォルト)。 |
プロトタイプ | これにより、単一の Bean 定義の範囲が任意の数のオブジェクト インスタンスを持つようになります。 |
リクエスト | これにより、Bean 定義の範囲が HTTP リクエストに限定されます。Web 対応 Spring ApplicationContext のコンテキストでのみ有効です。 |
セッション | これにより、Bean 定義の範囲が HTTP セッションに限定されます。Web 対応 Spring ApplicationContext のコンテキストでのみ有効です。 |
グローバルセッション | これにより、Bean 定義の範囲がグローバル HTTP セッションに限定されます。Web 対応 Spring ApplicationContext のコンテキストでのみ有効です。 |
この章では最初の 2 つのスコープについて説明し、残りの 3 つは Web 対応 Spring ApplicationContext について説明するときに説明します。
シングルトンスコープ:
スコープがシングルトンに設定されている場合、Spring IoC コンテナは、その Bean によって定義されたオブジェクトのインスタンスを 1 つだけ作成します。このシングルトンは、そのようなシングルトン Bean のキャッシュに格納され、その Bean に対する後続のすべてのリクエストと参照は、キャッシュされたオブジェクトを返します。
デフォルトのスコープは常にシングルトンですが、Bean のインスタンスが必要な場合は、以下に示すように、Bean 構成ファイルでシングルトンのスコープ属性を設定できます。
<!-- A bean definition with singleton scope -->
<bean id="..." class="..." scope="singleton">
<!-- collaborators and configuration for this bean go here -->
</bean>
例:
Eclipse IDE を使用し、以下の手順に従って Spring アプリケーションを作成しましょう。
ステップ | 説明する |
---|---|
1 | SpringExampleという名前のプロジェクトを作成し 、 作成したプロジェクトのsrcフォルダー の下に パッケージ com.manongjcを作成します。 |
2 | 「Spring Hello World の例」の章で説明されているように、 「外部 JAR の追加」 オプション を使用して、必要な Spring ライブラリを追加します 。 |
3 | Java クラス HelloWorld および MainApp をcom.manongjcパッケージ の下に 作成します 。 |
4 | srcフォルダー の下に Beans 構成ファイル Beans.xmlを作成します 。 |
5 | 最後のステップでは、すべての Java ファイルと Bean 構成ファイルの内容を作成し、以下で説明するようにアプリケーションを実行します。 |
HelloWorld.java ファイルの内容は次のとおりです。
package com.manongjc;
public class HelloWorld {
private String message;
public void setMessage(String message){
this.message = message;
}
public void getMessage(){
System.out.println("Your Message : " + message);
}
}
MainApp.java ファイルの内容は次のとおりです。
package com.manongjc;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
HelloWorld objA = (HelloWorld) context.getBean("helloWorld");
objA.setMessage("I'm object A");
objA.getMessage();
HelloWorld objB = (HelloWorld) context.getBean("helloWorld");
objB.getMessage();
}
}
以下は、シングルトン スコープ構成ファイルを必要とする beans.xml ファイルです。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="helloWorld" class="com.manongjc.HelloWorld"
scope="singleton">
</bean>
</beans>
ソース コードと Bean 構成ファイルの作成が完了したら、アプリケーションを実行します。すべてがうまくいけば、次のメッセージが出力されます。
Your Message : I'm object A
Your Message : I'm object A
プロトタイプの範囲:
スコープがプロトタイプに設定されている場合、Spring IoC コンテナは、その特定の Bean に対してリクエストが行われるたびに、オブジェクトの新しい Bean インスタンスを作成します。原則として、すべての状態にはプロトタイプ スコープの Bean クラスを使用し、ステートレス Bean にはシングルトン スコープの Bean を使用します。
プロトタイプのスコープを定義するには、以下に示すように、Bean 構成ファイルでプロトタイプのスコープ属性を設定します。
<!-- A bean definition with singleton scope -->
<bean id="..." class="..." scope="prototype">
<!-- collaborators and configuration for this bean go here -->
</bean>
例:
Eclipse IDE を適切な場所で動作させ、以下の手順に従って Spring アプリケーションを作成しましょう。
ステップ | 説明する |
---|---|
1 | SpringExampleという名前のプロジェクトを作成し 、 作成したプロジェクトのsrcフォルダー の下に パッケージ com.manongjcを作成します。 |
2 | 「Spring Hello World の例」の章で説明されているように、 「外部 JAR の追加」 オプション を使用して、必要な Spring ライブラリを追加します 。 |
3 | Java クラス HelloWorld および MainApp をcom.manongjcパッケージ の下に 作成します 。 |
4 | srcフォルダー の下に Beans 構成ファイル Beans.xmlを作成します 。 |
5 | 最後のステップでは、すべての Java ファイルと Bean 構成ファイルの内容を作成し、以下で説明するようにアプリケーションを実行します。 |
HelloWorld.java ファイルの内容は次のとおりです。
package com.manongjc;
public class HelloWorld {
private String message;
public void setMessage(String message){
this.message = message;
}
public void getMessage(){
System.out.println("Your Message : " + message);
}
}
MainApp.java ファイルの内容は次のとおりです。
package com.manongjc;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
HelloWorld objA = (HelloWorld) context.getBean("helloWorld");
objA.setMessage("I'm object A");
objA.getMessage();
HelloWorld objB = (HelloWorld) context.getBean("helloWorld");
objB.getMessage();
}
}
以下は、必要なプロトタイプ スコープの構成ファイル beans.xml です。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="helloWorld" class="com.manongjc.HelloWorld"
scope="prototype">
</bean>
</beans>
ソースコードとBean構成ファイルを作成したら、アプリケーションを実行してみましょう。すべてがうまくいけば、次のメッセージが出力されます。
Your Message : I'm object A
Your Message : null