オートワイヤーのコラボレーター

Spring コンテナーは、コラボレーションする Bean 間の関連をオートワイヤーできます。ApplicationContext の内容をインスペクションすることにより、Spring に Bean のコラボレーター(他の Bean)を自動的に解決させることができます。オートワイヤーには次の利点があります。

  • オートワイヤーにより、プロパティまたはコンストラクター引数を指定する必要性を大幅に減らすことができます。( この章の他の場所で説明する Bean テンプレートなどの他のメカニズムも、この点で有益です。)

  • オートワイヤーは、オブジェクトの進化に合わせて構成を更新できます。例: クラスに依存関係を追加する必要がある場合、構成を変更する必要なく、その依存関係を自動的に満たすことができます。自動ベース接続は、コードベースがより安定したときに明示的な接続に切り替えるオプションを無効にすることなく、開発中に特に役立ちます。

XML ベースの構成メタデータ(依存性注入を参照)を使用する場合、<bean/> エレメントの autowire 属性を使用して、Bean 定義のオートワイヤーモードを指定できます。オートワイヤー機能には 4 つのモードがあります。Bean ごとにオートワイヤーを指定するため、オートワイヤーするものを選択できます。次の表に、4 つのオートワイヤーモードを示します。

表 1: オートワイヤーモード
モード 説明

no

(デフォルト)オートワイヤーなし。Bean 参照は、ref 要素によって定義する必要があります。コラボレーターを明示的に指定すると、制御と明確さが向上するため、大きいデプロイの場合、デフォルト設定を変更することはお勧めしません。ある程度、システムの構造をドキュメント化します。

byName

プロパティ名によるオートワイヤー。Spring は、オートワイヤーが必要なプロパティと同じ名前の Bean を探します。例: Bean 定義が名前によるオートワイヤーに設定され、master プロパティが含まれている(つまり、setMaster(..) メソッドがある)場合、Spring は master という名前の Bean 定義を探し、それを使用してプロパティを設定します。

byType

コンテナーにプロパティ型の Bean が 1 つだけ存在する場合、プロパティを自動接続します。複数存在する場合、致命的な例外がスローされます。これは、その Bean に対して byType オートワイヤーを使用できないことを示しています。一致する Bean がない場合、何も起こりません(プロパティは設定されません)。

constructor

byType に似ていますが、コンストラクター引数に適用されます。コンテナー内にコンストラクター引数型の Bean が 1 つしかない場合、致命的なエラーが発生します。

byType または constructor オートワイヤーモードでは、配列と型付きコレクションを接続できます。このような場合、依存関係を満たすために、予想される型に一致するコンテナー内のすべてのオートワイヤー候補が提供されます。予想されるキー型が String の場合、強く型付けされた Map インスタンスをオートワイヤーできます。オートワイヤーされた Map インスタンスの値は、予想される型に一致するすべての Bean インスタンスで構成され、Map インスタンスのキーには対応する Bean 名が含まれています。

オートワイヤーの制限と欠点

オートワイヤーは、プロジェクト全体で一貫して使用される場合に最適に機能します。オートワイヤーが一般的に使用されない場合、開発者が 1 つまたは 2 つの Bean 定義のみを接続するためにそれを使用することは混乱を招く可能性があります。

オートワイヤーの制限と欠点を考慮してください。

  • property および constructor-arg 設定の明示的な依存関係は、常にオートワイヤーをオーバーライドします。プリミティブ、StringsClasses などの単純なプロパティ(およびそのような単純なプロパティの配列)をオートワイヤーすることはできません。この制限は仕様によるものです。

  • オートワイヤーは、明示的な接続ほど正確ではありません。ただし、前の表で記述されていたように、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 のオートワイヤーの候補ではありません。