Springコンテナが管理するBeanの定義方法は、主にXMLファイルを用いる方法、アノテーションを用いる方法、そしてJavaクラスを用いる方法の3つに大別されます。それぞれの手法には特性があり、プロジェクトの要件に合わせて適切に選択することが重要です。
1. XMLファイルによる設定
XMLベースの設定は、Springの初期から存在する伝統的な手法です。設定ファイル内に<bean>タグを記述し、インスタンス化するクラスやプロパティ、他のBeanとの依存関係を定義します。このタグには、通常idとclass属性を指定します。class属性は必須であり、完全修飾クラス名を指定することでSpringに対してどのクラスをインスタンス化するかを指示します。id属性は必須ではありませんが、他のBeanから参照する場合や設定の可読性を高めるために定義することが推奨されます。
例として、UserServiceクラスを定義する場合は以下のように記述します。
<bean id="userService" class="com.example.service.UserService"/>
2. アノテーションによる定義
アノテーションを用いる方法では、Beanの定義情報を実装クラス自体に付与します。クラス宣言部に@Componentなどのアノテーションを付けることで、Springコンテナは自動的にそのクラスをPOJO(Plain Old Java Object)として認識し、Beanとして登録します。これはXMLでの<bean>定義と同等の機能を果たします。
さらにSpringでは、アプリケーションの層(レイヤー)に応じて役割を明確にするため、@Componentを特殊化したステレオタイプアノテーションが提供されています。これらを使用することで、コードの可読性が向上し、特定の機能(AOPなど)を適用しやすくなります。
@Repository: データアクセス層(DAO)の実装クラスに付与@Service: ビジネスロジック層の実装クラスに付与@Controller: プレゼンテーション層のコントローラクラスに付与
@Serviceアノテーションを用いてBeanを定義する例です。
package com.example.model;
import org.springframework.stereotype.Service;
@Service
public class PaymentService {
// ビジネスロジックの実装
}
3. Javaクラスによる設定
Javaクラスによる設定は、設定情報をJavaコードとして記述する手法です。設定用クラスに@Configurationアノテーションを付与し、Beanを生成するメソッドに@Beanアノテーションを付けることで定義します。XMLやアノテーションによる宣言的な設定と比較して、Javaコードであるため条件分岐などのロジックを組み込みやすく、型安全性が高いという利点があります。
以下の例では、AppConfigクラスにてEmailSenderと、それに依存するNotificationServiceを定義しています。
package com.example.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.example.service.EmailSender;
import com.example.service.NotificationService;
@Configuration
public class AppConfig {
@Bean
public EmailSender emailSender() {
return new EmailSender();
}
@Bean
public NotificationService notificationService() {
// メソッド呼び出しにより依存関係を注入
return new NotificationService(emailSender());
}
}
このJavaベースの設定を有効にするには、XMLでコンポーネントスキャンを設定するか、アノテーションベースの設定ローダーを使用してこの設定クラスを読み込みます。これにより、Beanのインスタンス化と依存関係の解決がコードベースで柔軟に行えるようになります。