web-dev-qa-db-ja.com

Springは@Autowiredアノテーションなしでコンストラクタに依存関係を注入します

私はこの公式Spring tutorials のサンプルを試していますが、このコードには依存関係があります:
https://github.com/spring-guides/gs-async-method/tree/master/complete

AppRunner.Javaクラスのコードを見ると、2つの問題があります。

1)サーバーの起動時に、このクラスのコンストラクターにブレークポイントを配置すると、コンストラクターのように、GitHubLookupService@ Service構成されたBean。しかし、コンストラクタに@Autowired注釈がなかったので、このコンストラクタはどのようにして正しい依存関係で呼び出されますか? nullであるはずでした。

Spring Bootの自動仮定ですか?
Springは「プライベートフィールド+コンストラクター引数」を認識し、適切なBeanを探す必要があると想定していますか?
それはSpring FrameworkまたはSpring boot
何か不足していますか?

2)私が覚えているように、デフォルトコンストラクタをBean /サービスなどに提供することが必須でした。なぜこのクラス(AppRunner)にはデフォルトコンストラクタがないのですか? Springは、引数を指定してコンストラクターを実行する必要があることをどのように認識しますか?それは唯一のコンストラクターだからでしょうか?

45
winter

Spring4.3以降、Spring Beanとして設定されているクラスにコンストラクタが1つしかない場合、Autowiredアノテーションは省略できます。 Springはそのコンストラクターを使用し、必要な依存関係をすべて注入します。

defaultコンストラクターについて:デフォルトのコンストラクター、複数のコンストラクターがある場合はAutowired注釈付きのコンストラクター、または1つのコンストラクターのみが必要です。クラスでAutowiredアノテーションの有無にかかわらず。

詳細については、Springの公式ドキュメントの "@ Autowired" の章を参照してください。

98
dunni