1

Guice には同様の概念がありません。たとえば、Guice は、特別なクラス アノテーションを必要とせずに、デフォルトのコンストラクターを使用して任意のクラスを自動的に注入できます。spring が起動時にすべての Bean について知る必要があるのはなぜですか? 自動配線の目的で、クラスパスからクラスをルックアップするだけでは春になりませんか? 私が考えることができる 1 つの理由は、AOP のためです。しかし、AOP を使用していない場合、Bean 定義の計算全体によって、まったく不要なかなりの量の起動時間が追加されます。

編集:

明示的に、クラスパスからオンデマンドでクラスをルックアップする春が欲しい

@Component
class Bar {

}

@Component
class Foo {
    @Autowired Bar bar;
    public void doSomething() {}
}

Fooそのため、Springを使用して Bean を作成すると、クラスパスを簡単に検索できるようにするgetBean()必要があることがわかります。これは Guice が行うことであり、開発中に非常に遅くなる不必要なコンポーネントのスキャンを回避します。BarBar

4

1 に答える 1

1

@Component@Repository@Controller@Serviceアノテーションは、Spring IoC コンテナーによって「コンポーネント スキャン」できるさまざまな Bean を定義します。Spring コンテキストを定義するときに、スキャンするパッケージを指定できます。

class を明示的に使用して、登録 Spring Bean を作成できます。そのような場合、注釈を使用する必要はありません。

私の知る限り、注釈を使用せずに Bean を自動スキャンすることはできません。個人的には、IoC コンテナー (コンポーネント スキャンを使用している場合) によって駆動されていることがクラスを見れば明らかであるという事実が気に入っています。アノテーションなしでスキャンするというこのアイデアが Spring に浸透しないことを願っています。

編集

はい、できますが、このクラスを Bean として登録する必要があります。Java 構成の例:

@Configuration
public class SpringConfig{

    @Bean
    public Bar createBarBean(){
        new Bar();
    }
}

しかし、各 Bean を明示的に登録したくないため、これは便利ではないと思います。それはやり過ぎでしょう。

以下に、Spring ドキュメントの関連部分をいくつか示します。

他の Bean ルックアップ メカニズムについては知りません。

于 2014-10-07T08:35:42.480 に答える