Spring は、@Component、@Service、@Repository などの複数のタイプのアノテーションをサポートしています。これらはすべて org.springframework.stereotype パッケージにあります。
@Bean は org.springframework.context.annotation パッケージの下にあります。
アプリケーションのクラスに上記のアノテーションのいずれかが付けられている場合、プロジェクトの起動時に (@ComponentScan を使用して) 各クラスをスキャンし、クラスのインスタンスを IOC コンテナーに挿入します。@ComponentScan が行うもう 1 つのことは、@Bean を使用してメソッドを実行し、返されたオブジェクトを Ioc コンテナーに Bean として復元することです。
@成分
クラスを @Component または他のステレオタイプ アノテーションのいずれかでマークすると、これらのクラスはクラスパス スキャンを使用して自動検出されます。これらのクラスが基本パッケージの下にあるか、Spring がスキャンする別のパッケージを認識している限り、これらのクラスごとに新しい Bean が作成されます。
package com.beanvscomponent.controller;
import org.springframework.stereotype.Controller;
@Controller
public class HomeController {
public String home(){
return "Hello, World!";
}
}
注釈付きクラスと Bean の間に暗黙的な 1 対 1 のマッピングがあります (つまり、クラスごとに 1 つの Bean)。このアプローチは純粋に宣言的であるため、配線の制御はかなり制限されます。ステレオタイプ アノテーションはクラス レベルのアノテーションであることに注意することも重要です。
@豆
@Bean は、@Controller で行ったように Spring に自動的に宣言させるのではなく、単一の Bean を明示的に宣言するために使用されます。Bean の宣言をクラス定義から分離し、選択したとおりに Bean を作成および構成できるようにします。@Bean を使用すると、このアノテーションをクラス レベルに配置しません。これを行おうとすると、無効な型エラーが発生します。@Bean ドキュメントでは、次のように定義されています。
Indicates that a method produces a bean to be managed by the Spring container.
通常、@Bean メソッドは @Configuration クラス内で宣言されます。インスタンス化するために必要なユーザー クラスがあり、そのインスタンスを使用して Bean を作成します。これは、Bean の定義方法をもう少し制御できると前に述べた場所です。
package com.beanvscomponent;
public class User {
private String first;
private String last;
public User(String first, String last) {
this.first = first;
this.last = last;
}
}
前述したように、@Bean メソッドは @Configuration クラス内で宣言する必要があります。
package com.beanvscomponent;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ApplicationConfig {
@Bean
public User superUser() {
return new User("Partho","Bappy");
}
}
メソッドの名前は、実際には Bean の名前になります。アクチュエーターで /beans エンドポイントを引き上げると、Bean が定義されていることがわかります。
{
"beans": "superUser",
"aliases": [],
"scope": "singleton",
"type": "com.beanvscomponent.User",
"resource": "class path resource
[com/beanvscomponent/ApplicationConfig.class]",
"dependencies": []
}
@Component vs @Bean

いつ @Component を使用するか、いつ @Bean を使用するかについて、いくつかのことが明確になったことを願っています。少し混乱するかもしれませんが、より多くのアプリケーションを書き始めると、かなり自然になります。