基本概念: @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>
@Bean メソッド間のローカル呼び出しの有無にかかわらず、@Configuration クラスはありますか ?

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

@Bean メソッドが、@Configuration でアノテーションが付けられていないクラス内で宣言されている場合、または @Configuration(proxyBeanMethods=false) が宣言されている場合、「ライト」モードで処理されていると見なされます。このようなシナリオでは、@Bean メソッドは、特別なランタイム処理 (つまり、CGLIB サブクラスを生成しない) のない、実質的に汎用ファクトリメソッドメカニズムです。このようなメソッドへのカスタム Java 呼び出しは、コンテナーによってインターセプトされないため、通常のメソッド呼び出しと同じように動作し、特定の Bean の既存のシングルトン (またはスコープ付き) インスタンスを再利用するのではなく、毎回新しいインスタンスを作成します。

その結果、実行時プロキシのないクラスの @Bean メソッドは、Bean 間の依存関係を宣言することをまったく意図していません。代わりに、それらは、包含コンポーネントのフィールド、およびオプションで、オートワイヤーされたコラボレーターを受け取るためにファクトリメソッドが宣言する可能性のある引数に対して動作することが期待されています。このような @Bean メソッドは、他の @Bean メソッドを呼び出す必要はなく、代わりに、そのような呼び出しはすべてファクトリメソッド引数で表現できます。ここでのプラスの副作用は、実行時に CGLIB サブクラス化を適用する必要がないため、オーバーヘッドとフットプリントが削減されることです。

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