1. SpringにおけるBean管理の基本概念
Spring Frameworkの中核を成すのは、IoC(制御の反転)とDI(依存性の注入)です。これらは「疎結合」なアーキテクチャを実現するための仕組みです。Springコンテナで管理されるオブジェクトは「Bean」と呼ばれ、開発者は必要なときにコンテナからBeanを取り出して利用します。
Beanの登録と取得
古くからある手法では、XMLファイル(例: spring-config.xml)にBeanの情報を定義します。
<beans xmlns="http://www.springframework.org/schema/beans" ...>
<bean id="userService" class="com.example.UserService" />
</beans>
アプリケーションコードでは、ApplicationContextを使用してBeanを取得します。
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
UserService service = context.getBean(UserService.class);
2. アノテーションによる宣言的Bean管理
現代のSpring開発では、XMLでの明示的な定義よりも、クラスに付与するアノテーションが一般的です。まずは設定ファイルでスキャン対象のパッケージを指定します。
<context:component-scan base-package="com.example" />
5つの主要なステレオタイプアノテーション
@Controller: プレゼンテーション層。リクエストを受け付け、入力値の検証を行います。@Service: サービス層。ビジネスロジックを実装します。@Repository: データアクセス層。データベースとの直接的なやり取りを担います。@Configuration: 設定層。SpringのBean定義をプログラムで行います。@Component: 上記に当てはまらない汎用的なコンポーネント。
これらを使うことで、クラスを自動的にBeanとして登録できます。Bean名は、クラス名の先頭を小文字にしたものがデフォルトとなります(例: UserService → userService)。
@Beanアノテーションによるメソッド管理
メソッドレベルで@Beanを付与することで、サードパーティのライブラリのインスタンスなどもBeanとしてコンテナに登録可能です。
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
3. 依存性の注入(DI)の手法
Bean間の依存関係を解消するために、@Autowiredアノテーションを用います。
- フィールド注入: フィールドに直接付与する(手軽だがテストしにくい)。
- コンストラクタ注入: コンストラクタで依存関係を強制する(推奨される手法)。
- Setter注入: Setterメソッド経由で注入する(オプションの依存関係に適している)。
コンストラクタ注入の例:
@Controller
public class UserController {
private final UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
}
コンストラクタ注入を使用することで、イミュータブルな設計が可能となり、ユニットテスト時にもモックの注入が容易になるというメリットがあります。