【Spring Boot】@Configuration と @Bean の違いをやさしく解説

Java入門・実践
スポンサーリンク
スポンサーリンク

Spring を使っているとよく見かける
@Configuration@Bean

なんとなく「設定を書くところ」「Bean を作るところ」というイメージはあるけれど、
「どう違うのか」「どんなときに使うのか」 と聞かれると、
少し説明しづらい部分でもあります。

この記事では、@Configuration と @Bean の違いを
やさしく・実務で役立つ形 で整理していきます。

まずはコードを見て、そこから少しずつ理解していきましょう。

まずはコードを確認

Java
@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 を付けない場合

Java
@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 を手動で作るための仕組み」
と理解できれば十分です。


decopon
decopon

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

moco
moco

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

コメント

タイトルとURLをコピーしました