1. はじめに
Springフレームワークを用いたアプリケーション開発をする中で、Bean定義の使い分けがわからずに調べた内容を記事としてまとめます。
1. 3種類のBean定義
Springにおいて、Bean(ビーン)の定義はアプリケーションのコンポーネントをSpringのDIコンテナに登録する手段です。Beanの定義には3つの方法があります。
1.1 アノテーションベースのBean定義
使用場面: 自動検出によってBeanをスキャンしてコンテナに登録する場合。
特徴: @ComponentScanアノテーションを使用し、特定のパッケージ以下のコンポーネントをスキャンしてBeanとして定義される。
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
// 何も定義しなくても、スキャンされたコンポーネントが自動的にBeanとして登録される。
}
1.2 JavaベースのBean定義
- 使用場面: Java構成クラスを使用してBeanを定義する場合。
- 特徴: @Configurationアノテーションが付いたJavaクラス内で@Beanアノテーションを使用して定義される。
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
1.3 xmlベースのBean定義
- 使用場面: 伝統的なアプローチで、設定を外部のXMLファイルに定義する場合。
- 特徴: XMLファイルにBeanの設定が書かれる。コンテナの設定ファイル(通常はapplicationContext.xml)で定義される。
<bean id="myBean" class="com.example.MyBean">
<property name="property1" value="value1" />
</bean>
2. Bean定義の使い分け
まず、アノテーションベースとJavaベースを比較します。
アノテーションベースの長所は大量のBean定義が簡潔にできることです。各Implクラスにアノテーションを付けるだけなので、開発者の負担は大きくありません。短所としては、開発者が作成したクラスにしか使えないことです。例えば、データベース接続を管理するDataSourceインターフェースのImplクラスはライブラリを活用しますが、ライブラリのソースコードを改変することはできないため、アノテーションをつけられません。
対して、Javaベースの長所は、このようなライブラリが提供するImplクラスでもBean定義できることです。ライブラリのImplクラスをコンストラクタとして呼び出し、戻り値で返せばBean定義することができます。短所は、大量に定義する負担が大きいことです。
このため、開発者が作成したImplクラスのBeanを定義する際はアノテーションベースの定義、ライブラリのクラスを定義する場合はJavaベースの定義を使えばよいとわかります。
最後に、xmlベースのBean定義ですが現在あまり使われていません。なぜならばxmlベースはJavaベースの下位互換であるためです。xmlベースの長所短所は上記のJavaベースのものと同じですが、xmlベースの場合は、クラス名を文字列で記述するため間違えの温床となるためです。
3.おわりに
Bean定義の使い分けを整理することができました。Springフレームワークの理解に貢献できたら幸いです。