Spring を使っているとよく見かける
@Configuration と @Bean。
なんとなく「設定を書くところ」「Bean を作るところ」というイメージはあるけれど、
「どう違うのか」「どんなときに使うのか」 と聞かれると、
少し説明しづらい部分でもあります。
この記事では、@Configuration と @Bean の違いを
やさしく・実務で役立つ形 で整理していきます。
まずはコードを見て、そこから少しずつ理解していきましょう。
まずはコードを確認
@Configuration
public class AppConfig {
@Bean
public GreetingService greetingService() {
return new GreetingService();
}
}このコードでは、AppConfig が設定クラスとして扱われ、
その中の greetingService() が Bean として登録されます。
コードのしくみを解説
@Configuration とは
一言でいうと、
「設定クラスですよ」と Spring に伝えるアノテーション
です。
- このクラスの中には Bean 定義があります
- Spring が特別扱いしてくれます
- メソッドの戻り値を Bean として登録できます
という役割を持っています。
@Bean とは
一言でいうと、
「このメソッドの戻り値を Bean として登録してください」
という指示です。
- メソッドの戻り値が Bean になる
- 外部ライブラリのクラスなど、アノテーションを付けられないものを Bean 化できる
- DI の対象として利用できる
という特徴があります。
@Configuration と @Bean の関係
実はこの 2 つはセットで使われることが多く、 役割は次のように整理できます。
- @Configuration → 「設定クラス」
- @Bean → 「Bean を作るメソッド」
つまり、
@Configuration の中に @Bean を書くことで、Bean を手動で登録できる
という構造になっています。
あわせて知っておきたいポイント
@Configuration が付いていると「CGLIB による拡張」が行われる
@Configration を付けると、Spring がクラスを拡張し、
@Bean メソッドを呼び出したときに Singleton を保証 してくれます。
例: 同じ @Bean メソッドを複数回呼んでも、同じインスタンスが返ってくる。
@Configuration を付けない場合
@Component
public class AppConfig {
@Bean
public GreetingService greetingService() {
return new GreetingService();
}
}このように @Component だけでも動きますが、
@Configration のような Singleton 保証が効かないため、
複数インスタンスが生成される可能性があります。
実務では 設定クラスには必ず @Configuration を付ける のが基本です。
@Bean は外部ライブラリのクラスに便利
例えば、外部のクライアントライブラリや設定オブジェクトなど、
アノテーションを付けられないクラスを Bean 化したいときに使います。
使うときに気をつけたいこと
設定クラスには @Configuration を付ける
Singleton 保証が効くため、意図しない複数生成を防げます。
@Bean は必要なときだけ
基本は @Component / @Service / @Repository で十分です。
外部ライブラリや特殊な初期化が必要なときだけ @Bean を使うのが自然です。
@Bean メソッド内で new を使うのは OK
DI を使うときは new を避けますが、
@Bean メソッド内は「Bean を作る場所」なので new を使って問題ありません。
まとめ
@Configuration と @Bean は、Spring の設定を行うためのアノテーションです。
- @Configuration → 設定クラス
- @Bean → Bean を作るメソッド
難しく聞こえますが、
「設定クラスの中で Bean を手動で作るための仕組み」
と理解できれば十分です。

設定まわりは最初とっつきにくいですが、
理解が進むと Spring の動きがぐっとクリアになります。
あなたの開発が、今日より少しだけ楽になりますように。

@Configuration の中で @Bean を育ててるみたいだね。なんだか温室みたいであったかいなあ。

コメント