ホームページ >Java >&#&チュートリアル >Spring-:なぜspring-cannot-match-by-name-for-injection
スプリング依存注入:なぜ自動的に名前と一致できないのですか?
に基づいています。同じタイプの複数のタイプ(TenantDataSourceなど)に遭遇した場合、パラメーター名に従って一致するように自動的に戻りません。これは、Springがメソッドのパラメーター名をBean名と一致させることができると常に保証できるとは限らないためです。 javaデフォルトでは、
は、コンパイルされたbytecodeでパラメーター名を保持しません。特別な構成がない場合、パラメーター名(たとえば、tenantadatasourceやtenantbdatasource)が編集中にクリアされ、arg0やarg1などのユニバーサル名に置き換えられます。 したがって、春はTenantadatasourceが「Tenanta-Datasource」と呼ばれる豆を指していることを知ることができません。 パラメーター名保持問題を解きます
コンパイラロゴを使用して、バイトコードにパラメーター名を保持できます。
このロゴが使用されている場合でも、Springは構成がクリアされていない限り、パラメーター名と一致しません。 -parameters
<code>javac -parameters MyClass.java</code>など)、Springは開発者の意図を決定することができず、間違った豆を注入する代わりにエラーを投げることを選択します。
スプリングは、「隠されたよりも明示的に優れている」という原則に従います。依存噴射は予測可能であるべきであり、パラメーター名の仮定の仮定に依存しないでください。春は、さまざまな環境とフレームワークで一貫しています。一部の言語またはフレームワーク(Kotlinなど)は、デフォルトでパラメーター名を保持しますが、他の言語は保持されません。
@Qualifier
名前の一致はいつ自動的に動作できますか?
例:
-parameters
なぜスプリングは @qualifierを使用する傾向があるのですか?
<code>@Autowired public TenantService(TenantDataSource tenantADataSource, TenantDataSource tenantBDataSource) { this.tenantADataSource = tenantADataSource; this.tenantBDataSource = tenantBDataSource; }</code>例:
この方法では、パラメーター名やその他の要因に関係なく、スプリングは注入する豆を正確に知ることができます。 -parameters
スプリングのようなフレームワークはよりインテリジェントであるべきだと考える人もいれば、あいまいさがあるときにビーン名はパラメーター名と自動的に一致すると考えるかもしれません。しかし、:
@Qualifier
開発者は、意味のあるBean名とパラメーター名を使用しますが、明確さを確保するために
@Qualifier
Factoryベースのメソッド(例:Abstractroutingatasorce)を動的に構成します。 spring最初の注入
@Qualifier
明示的は隠されたよりも優れています-parameters
Springのデザインコンセプト
以上がSpring-:なぜspring-cannot-match-by-name-for-injectionの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。