ホームページ >Java >&#&チュートリアル >Spring-:なぜspring-cannot-match-by-name-for-injection

Spring-:なぜspring-cannot-match-by-name-for-injection

DDD
DDDオリジナル
2025-01-28 22:08:11169ブラウズ

spring-: why-spring-cannot-match-by-name-for-injection

スプリング依存注入:なぜ自動的に名前と一致できないのですか?

Springの依存関係注入メカニズムは、主に名前ではなくタイプ

に基づいています。同じタイプの複数のタイプ(TenantDataSourceなど)に遭遇した場合、パラメーター名に従って一致するように自動的に戻りません。これは、Springがメソッドのパラメーター名をBean名と一致させることができると常に保証できるとは限らないためです。 javaデフォルトでは、

は、コンパイルされたbytecodeでパラメーター名

を保持しません。特別な構成がない場合、パラメーター名(たとえば、tenantadatasourceやtenantbdatasource)が編集中にクリアされ、arg0やarg1などのユニバーサル名に置き換えられます。 したがって、春はTenantadatasourceが「Tenanta-Datasource」と呼ばれる豆を指していることを知ることができません。 パラメーター名保持問題を解きます

コンパイラロゴを使用して、バイトコードにパラメーター名を保持できます。

このロゴが使用されている場合でも、Springは構成がクリアされていない限り、パラメーター名と一致しません。 -parameters

春は事故を防ぐための仮定を避けます。たとえば、パラメーター名が誤って交換または名前が付けられている場合、または開発者が異なるマッピングを期待している場合、何が起こりますか? 明確なガイダンスがない場合(
<code>javac -parameters MyClass.java</code>
など)、Springは開発者の意図を決定することができず、間違った豆を注入する代わりにエラーを投げることを選択します。

スプリングは、「隠されたよりも明示的に優れている」という原則に従います。依存噴射は予測可能であるべきであり、パラメーター名の仮定の仮定に依存しないでください。春は、さまざまな環境とフレームワークで一貫しています。一部の言語またはフレームワーク(Kotlinなど)は、デフォルトでパラメーター名を保持しますが、他の言語は保持されません。

@Qualifier名前の一致はいつ自動的に動作できますか?

spring 4.3パラメーター名発見

ロゴがコードをコンパイルする場合、あいまいさがある場合、springはパラメーター名から豆の名前を推測できます。

例:

ロゴとパラメーター名(TenantadataSource、TenantBDataSource)とBean Nameが一致している場合、Springは曖昧さを解くことができます。ただし、この動作は、複雑な構成では常に信頼性があるか予測可能ではないため、優先表示構成(

など)が優先されます。

-parametersなぜスプリングは @qualifierを使用する傾向があるのですか?

を使用して、開発者とフレームワークの両方が明確に意図できるように、定義を確保し、曖昧さを排除します。

<code>@Autowired
public TenantService(TenantDataSource tenantADataSource, TenantDataSource tenantBDataSource) {
    this.tenantADataSource = tenantADataSource;
    this.tenantBDataSource = tenantBDataSource;
}</code>
例:

この方法では、パラメーター名やその他の要因に関係なく、スプリングは注入する豆を正確に知ることができます。 -parameters

春はより賢いはずですか?

スプリングのようなフレームワークはよりインテリジェントであるべきだと考える人もいれば、あいまいさがあるときにビーン名はパラメーター名と自動的に一致すると考えるかもしれません。しかし、:

  1. back互換性:この動作を自動的に変更すると、Bean名とパラメーター名と一致しない既存のアプリケーションが破壊される場合があります。
  2. 予測可能性
  3. :曖昧さ(たとえば、)を明示的に解決して、開発者がどのBeanが注入されているかを常に把握できるようにします。特に大規模な複雑なアプリケーションでは、再設計可能な仮定がデバッグを引き起こす可能性があります。 @Qualifier
  4. 実際のシーンの状況
ほとんどの実際のアプリケーションでは

開発者は、意味のあるBean名とパラメーター名を使用しますが、明確さを確保するために
    を好むことも好みます。
  • マルチエクサムシーンの場合、各豆を手動で接続するのではなく、@QualifierFactoryベースのメソッド(例:Abstractroutingatasorce)を動的に構成します。
  • キーポイント

    spring最初の注入

:豆のタイプが1つしかない場合、スプリングは問題なく注入します。同じタイプの複数の豆がある場合、Springは曖昧さを解決するために追加のプロンプト(

など)が必要です。

    パラメーター名は信頼できません
  1. :デフォルトでは、パラメーター名はJavaバイトコードに保持されないため、パラメーターをパラメーターと一致させるためにそれらを使用できません。パラメーター名()が保持されている場合でも、Springは構成が明確でない限り、よく知られているマッチングマッチングを回避します。 @Qualifier明示的は隠されたよりも優れています
  2. :春の優先度の考慮が予測可能であり、開発者は隠されたマッチングに依存するのではなく、明示的な構成(
  3. など)を使用するように促します。 -parameters

    Springのデザインコンセプト

  4. :霧のエラーは事故を防ぎ、開発者が依存注入を完全に制御できるようにします。

以上がSpring-:なぜspring-cannot-match-by-name-for-injectionの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。