導入
@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 を使いたくなる場面を考えてみましょう(ヒント: 環境によって作るインスタンスを変えたい、コンストラクタ引数に設定値を渡したい、といったケースです)。