本文へスキップ
BecomeCoder

Spring / Spring Bootコース · 第2章 Bean と DIコンテナ ― Springに管理してもらう部品たち · レッスン5

自分でBeanを組み立てる ― @Configurationと@Bean

ローカル実施

導入

@Component は自分が書いたクラスにしか付けられません。では、外部ライブラリが提供するクラス(例えばJSON変換ライブラリのクラス)をBeanにしたいときはどうすればよいでしょうか。

説明

自分でクラスにアノテーションを付けられない場合は、設定クラスの中でインスタンスを作る「作り方」をSpringに教えます。設定クラスには @Configuration を、Bean化したいオブジェクトを返すメソッドには @Bean を付けます。

@Configuration
class AppConfig {

    @Bean
    public RestTemplate restTemplate() {
        // 外部ライブラリのクラス。自分ではアノテーションを付けられない
        return new RestTemplate();
    }

    @Bean
    public Clock clock() {
        return Clock.systemDefaultZone();
    }
}

メソッドの戻り値がそのままBeanとしてコンテナに登録されます。メソッド名(この例では restTemplate)がBeanの名前になります。他のクラスは、この RestTemplate を通常のBeanと同じようにコンストラクタで受け取れます。

@Service
class PaymentClient {
    private final RestTemplate restTemplate;

    public PaymentClient(RestTemplate restTemplate) {
        this.restTemplate = restTemplate; // @Beanで作られたBeanが注入される
    }
}

まとめると、Beanの作り方は用途に応じて使い分けます。

状況方法
自分が書くクラス@Component(や @Service 等)をクラスに付ける
外部ライブラリのクラス・複雑な組み立てが必要@Configuration クラスの中で @Bean メソッドを書く

やってみよう

「外部ライブラリのクラスだから @Component を付けられない」以外にも、@Bean を使いたくなる場面を考えてみましょう(ヒント: 環境によって作るインスタンスを変えたい、コンストラクタ引数に設定値を渡したい、といったケースです)。