オートワイヤーのコラボレーター
Spring コンテナーは、コラボレーションする Bean 間の関連をオートワイヤーできます。ApplicationContext
の内容をインスペクションすることにより、Spring に Bean のコラボレーター(他の Bean)を自動的に解決させることができます。オートワイヤーには次の利点があります。
オートワイヤーにより、プロパティまたはコンストラクター引数を指定する必要性を大幅に減らすことができます。( この章の他の場所で説明する Bean テンプレートなどの他のメカニズムも、この点で有益です。)
オートワイヤーは、オブジェクトの進化に合わせて構成を更新できます。例: クラスに依存関係を追加する必要がある場合、構成を変更する必要なく、その依存関係を自動的に満たすことができます。自動ベース接続は、コードベースがより安定したときに明示的な接続に切り替えるオプションを無効にすることなく、開発中に特に役立ちます。
XML ベースの構成メタデータ(依存性注入を参照)を使用する場合、<bean/>
エレメントの autowire
属性を使用して、Bean 定義のオートワイヤーモードを指定できます。オートワイヤー機能には 4 つのモードがあります。Bean ごとにオートワイヤーを指定するため、オートワイヤーするものを選択できます。次の表に、4 つのオートワイヤーモードを示します。
モード | 説明 |
---|---|
| (デフォルト)オートワイヤーなし。Bean 参照は、 |
| プロパティ名によるオートワイヤー。Spring は、オートワイヤーが必要なプロパティと同じ名前の Bean を探します。例: Bean 定義が名前によるオートワイヤーに設定され、 |
| コンテナーにプロパティ型の Bean が 1 つだけ存在する場合、プロパティを自動接続します。複数存在する場合、致命的な例外がスローされます。これは、その Bean に対して |
|
|
byType
または constructor
オートワイヤーモードでは、配列と型付きコレクションを接続できます。このような場合、依存関係を満たすために、予想される型に一致するコンテナー内のすべてのオートワイヤー候補が提供されます。予想されるキー型が String
の場合、強く型付けされた Map
インスタンスをオートワイヤーできます。オートワイヤーされた Map
インスタンスの値は、予想される型に一致するすべての Bean インスタンスで構成され、Map
インスタンスのキーには対応する Bean 名が含まれています。
オートワイヤーの制限と欠点
オートワイヤーは、プロジェクト全体で一貫して使用される場合に最適に機能します。オートワイヤーが一般的に使用されない場合、開発者が 1 つまたは 2 つの Bean 定義のみを接続するためにそれを使用することは混乱を招く可能性があります。
オートワイヤーの制限と欠点を考慮してください。
property
およびconstructor-arg
設定の明示的な依存関係は、常にオートワイヤーをオーバーライドします。プリミティブ、Strings
、Classes
などの単純なプロパティ(およびそのような単純なプロパティの配列)をオートワイヤーすることはできません。この制限は仕様によるものです。オートワイヤーは、明示的な接続ほど正確ではありません。ただし、前の表で記述されていたように、Spring は、予期しない結果が生じる可能性のあるあいまいな場合に推測を避けるように注意しています。Spring 管理対象オブジェクト間の関連は、明示的にドキュメント化されなくなりました。
Spring コンテナーからドキュメントを生成するツールでは、接続情報を利用できない場合があります。
コンテナー内の複数の Bean 定義は、setter メソッドまたはオートワイヤーされるコンストラクター引数で指定された型と一致する場合があります。配列、コレクション、
Map
インスタンスの場合、これは必ずしも問題ではありません。ただし、単一の値を期待する依存関係の場合、このあいまいさは勝手に解決されません。一意の Bean 定義が利用できない場合、例外がスローされます。
後者のシナリオでは、いくつかのオプションがあります。
明示的な接続を優先してオートワイヤーを放棄します。
次のセクションで説明するように、Bean 定義の
autowire-candidate
属性をfalse
に設定して、Bean 定義のオートワイヤーを回避します。<bean/>
要素のprimary
属性をtrue
に設定することにより、単一の Bean 定義を 1 次候補として指定します。アノテーションベースのコンテナー構成に従って、アノテーションベースの構成で利用可能な、よりきめ細かい制御を実装します。
オートワイヤーから Bean を除外する
Bean ごとに、Bean をオートワイヤリングから除外できます。Spring の XML 形式では、<bean/>
要素の autowire-candidate
属性を false
に設定します。@Bean
アノテーションを使用すると、属性の名前は autowireCandidate
になります。コンテナーにより、その特定の Bean 定義は、@Autowired
などのアノテーションベースのインジェクションポイントを含むオートワイヤリングインフラストラクチャで使用できなくなります。
autowire-candidate 属性は、型ベースのオートワイヤーのみに影響するように設計されています。指定された Bean がオートワイヤー候補としてマークされていない場合でも、名前による明示的な参照には影響しません。結果として、名前によるオートワイヤーは、名前が一致する場合、Bean を注入します。 |
Bean 名に対するパターンマッチングに基づいて、オートワイヤーの候補を制限することもできます。最上位の <beans/>
要素は、default-autowire-candidates
属性内で 1 つ以上のパターンを受け入れます。例: オートワイヤー候補のステータスを、名前が Repository
で終わる Bean に制限するには、値 *Repository
を指定します。複数のパターンを提供するには、コンマ区切りリストで定義します。Bean 定義の autowire-candidate
属性の明示的な値 true
または false
が常に優先されます。このような Bean の場合、パターンマッチングルールは適用されません。
これらの手法は、オートワイヤーによって他の Bean に注入したくない Bean に役立ちます。除外された Bean 自体をオートワイヤーを使用して構成できないという意味ではありません。むしろ、Bean 自体は他の Bean のオートワイヤーの候補ではありません。