最新の安定バージョンについては、Spring Framework 6.2.11 を使用してください!

基本概念: @Bean および @Configuration

Spring の Java 構成サポートの中心的な成果物は、@Configuration アノテーション付きクラスと @Bean アノテーション付きメソッドです。

@Bean アノテーションは、メソッドが Spring IoC コンテナーによって管理される新しいオブジェクトをインスタンス化、構成、初期化することを示すために使用されます。Spring の <beans/> XML 構成に精通している場合、@Bean アノテーションは <bean/> 要素と同じロールを果たします。@Bean アノテーション付きメソッドは、任意の Spring @Component で使用できます。ただし、ほとんどの場合、@Configuration Bean で使用されます。

クラスに @Configuration のアノテーションを付けると、その主な目的が Bean 定義のソースであることを示します。さらに、@Configuration クラスでは、同じクラス内の他の @Bean メソッドを呼び出すことにより、Bean 間の依存関係を定義できます。最も単純な @Configuration クラスは次のようになります。

  • Java

  • Kotlin

@Configuration
public class AppConfig {

	@Bean
	public MyServiceImpl myService() {
		return new MyServiceImpl();
	}
}
@Configuration
class AppConfig {

	@Bean
	fun myService(): MyServiceImpl {
		return MyServiceImpl()
	}
}

上記の AppConfig クラスは、次の Spring <beans/> XML と同等です。

<beans>
	<bean id="myService" class="com.acme.services.MyServiceImpl"/>
</beans>
フル @Configuration vs「ライト」@Bean モード?

@Bean メソッドが @Configuration アノテーションが付けられていないクラス内で宣言されている場合、「ライト」モードで処理されることを示します。@Component またはプレーンな通常のクラスで宣言された Bean メソッドは、「ライト」と見なされ、包含クラスと @Bean メソッドの主な目的は、一種のボーナスです。例: サービスコンポーネントは、適用可能な各コンポーネントクラスで追加の @Bean メソッドを使用して、管理ビューをコンテナーに公開できます。このようなシナリオでは、@Bean メソッドは汎用ファクトリメソッドメカニズムです。

完全な @Configuration とは異なり、ライト @Bean メソッドは Bean 間の依存関係を宣言できません。代わりに、含まれるコンポーネントの内部状態と、オプションで、宣言できる引数を操作します。このような @Bean メソッドは、他の @Bean メソッドを呼び出さないでください。そのような各メソッドは、文字通り特定の Bean 参照のファクトリメソッドであり、特別なランタイムセマンティクスはありません。ここでのプラスの副作用は、実行時に CGLIB サブクラス化を適用する必要がないことです。そのため、クラス設計に関して制限はありません(つまり、包含クラスは final などになります)。

一般的なシナリオでは、@Bean メソッドは @Configuration クラス内で宣言され、「フル」モードが常に使用されるようにし、メソッド間の参照がコンテナーのライフサイクル管理にリダイレクトされるようにします。これにより、同じ @Bean メソッドが通常の Java 呼び出しを介して誤って呼び出されることを防ぎます。これにより、「ライト」モードでの操作時に追跡が困難な微妙なバグを減らすことができます。

@Bean および @Configuration アノテーションについては、次のセクションで詳しく説明します。ただし、最初に、Java ベースの構成を使用して Spring コンテナーを作成するさまざまな方法について説明します。