611

@Componentクラスパススキャンを使用してxml Bean定義を取り除くために、Spring 2.5でアノテーションが導入されたことを理解しています。

@BeanSpring 3.0 で導入され@Configuration、xml ファイルを完全に取り除き、代わりに java config を使用するために使用できます。

@Componentアノテーションを導入する代わりに、アノテーションを再利用することは可能でした@Beanか? 私の理解では、最終的な目標はどちらの場合も Bean を作成することです。

4

15 に答える 15

540

@Component コンポーネントのスキャンと自動配線に適しています。

いつ@Beanを使用する必要がありますか?

自動構成がオプションでない場合もあります。いつ?サードパーティのライブラリ (ソース コードがないため、そのクラスに @Component でアノテーションを付けることはできません) からコンポーネントを配線したいので、自動構成は不可能であるとします。

@Beanアノテーションは、 Springがアプリケーション コンテキストで Bean として登録する必要があるオブジェクトを返します。メソッドの本体には、インスタンスの作成を担当するロジックが含まれます。

于 2016-11-29T08:40:27.913 に答える
529

@Component@Bean2 つのまったく異なることを行いますが、混同しないでください。

@Component(および@Serviceおよび@Repository) は、クラスパス スキャンを使用して Bean を自動検出および自動構成するために使用されます。注釈付きクラスと Bean の間に暗黙的な 1 対 1 のマッピングがあります (つまり、クラスごとに 1 つの Bean)。このアプローチは純粋に宣言的であるため、配線の制御はかなり制限されます。

@Bean上記のようにSpringに自動的に宣言させるのではなく、単一のBeanを明示的に宣言するために使用されます。Bean の宣言をクラス定義から分離し、選択したとおりに Bean を作成および構成できるようにします。

あなたの質問に答えるには...

@Componentアノテーションを導入する代わりに、アノテーションを再利用することは可能でした@Beanか?

確かに、おそらく。しかし、この 2 つはまったく異なるため、そうしないことを選択しました。春は、水をさらに濁らせることなく、すでに十分に混乱しています.

于 2012-05-15T15:59:09.537 に答える
22

このタグを使用する@Componentと、POJO (Plain Old Java Object) にバニラビーン宣言メソッド ( のアノテーションが付けられます) を持つのと同じになり@Beanます。たとえば、次の方法 1 と 2 は同じ結果になります。

方法 1

@Component
public class SomeClass {

    private int number;

    public SomeClass(Integer theNumber){
        this.number = theNumber.intValue();
    }

    public int getNumber(){
        return this.number;
    }
}

「theNumber」のBeanを使用:

@Bean
Integer theNumber(){
    return new Integer(3456);
}

方法 2

//Note: no @Component tag
public class SomeClass {

    private int number;

    public SomeClass(Integer theNumber){
        this.number = theNumber.intValue();
    }

    public int getNumber(){
        return this.number;
    }
}

両方の豆で:

@Bean
Integer theNumber(){
    return new Integer(3456);
}

@Bean
SomeClass someClass(Integer theNumber){
    return new SomeClass(theNumber);
}

方法 2 を使用すると、Bean 宣言をまとめて保持できます。これは、もう少し柔軟です。次のような別の非バニラ SomeClass Bean を追加することもできます。

@Bean
SomeClass strawberryClass(){
    return new SomeClass(new Integer(1));
}
于 2018-01-19T18:23:29.567 に答える
2

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

于 2021-11-07T07:38:54.090 に答える