Rumah >Java >javaTutorial >Spring-: Why-Spring-Cannot-Match-by-Name-For-Injection

Spring-: Why-Spring-Cannot-Match-by-Name-For-Injection

DDD
DDDasal
2025-01-28 22:08:11212semak imbas

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

Suntikan Ketergantungan Spring: Kenapa ia tidak boleh dipadankan dengan nama secara automatik?

Mekanisme suntikan pergantungan musim bunga terutamanya

berdasarkan jenis , bukan nama. Apabila menghadapi pelbagai jenis jenis yang sama (seperti TenantDataSource), ia tidak akan kembali secara automatik untuk dipadankan mengikut nama parameter. Ini kerana Spring tidak boleh selalu menjamin nama parameter dalam kaedah yang sesuai dengan nama kacang.

java secara lalai,

tidak akan mengekalkan nama parameter dalam bytecode yang disusun. Sekiranya tidak ada konfigurasi khas, nama parameter (contohnya, TenantAdataSource dan TenantBDataSource) akan dibersihkan semasa kompilasi dan menggantikannya dengan nama sejagat, seperti Arg0 dan Arg1. Oleh itu, musim bunga tidak dapat mengetahui bahawa tenantadataSource merujuk kepada kacang yang dipanggil "Tenanta-Datasource".

menyelesaikan masalah pengekalan nama parameter

anda boleh menggunakan logo pengkompil untuk mengekalkan nama parameter dalam kod byte:

-parameters

Walaupun logo ini digunakan, musim bunga masih tidak sepadan dengan nama parameter kecuali konfigurasi adalah jelas.
<code>javac -parameters MyClass.java</code>

Spring mengelakkan andaian untuk mencegah kemalangan. Sebagai contoh, jika nama parameter secara tidak sengaja ditukar atau dinamakan, atau pemaju mengharapkan pemetaan yang berbeza, apa yang akan berlaku? Sekiranya tidak ada panduan yang jelas (seperti

), musim bunga tidak dapat menentukan niat pemaju, dan memilih untuk membuang kesilapan dan bukannya menyuntik kacang yang salah.

@Qualifier Spring mengikuti prinsip "jelas lebih baik daripada tersembunyi". Suntikan bergantung harus diramalkan, dan tidak bergantung kepada andaian nama parameter kepada pemadanan padanan nama kacang. Spring adalah konsisten dalam persekitaran dan kerangka yang berbeza. Sesetengah bahasa atau kerangka (seperti Kotlin) mengekalkan nama parameter secara lalai, sementara bahasa lain tidak dikekalkan.

Bilakah nama yang boleh dipadankan boleh berfungsi secara automatik?

Walaupun musim bunga tidak sepadan dengan nama parameter secara lalai, ia boleh dipadankan mengikut nama parameter dalam beberapa kes, tetapi ia bergantung pada tetapan anda:

Spring 4.3 Parameter Nama Discover

Jika kod kompilasi logo , apabila terdapat kekaburan, musim bunga dapat menyimpulkan nama kacang dari nama parameter.

Contoh: -parameters

Jika nama logo dan parameter (TenantAdataSource, TenantBDataSource) dan nama kacang dipadankan, Spring dapat menyelesaikan kekaburan. Walau bagaimanapun, tingkah laku ini tidak selalu boleh dipercayai atau boleh diramal dalam konfigurasi kompleks, itulah sebabnya konfigurasi paparan pilihan (seperti

).

<code>@Autowired
public TenantService(TenantDataSource tenantADataSource, TenantDataSource tenantBDataSource) {
    this.tenantADataSource = tenantADataSource;
    this.tenantBDataSource = tenantBDataSource;
}</code>
Kenapa musim bunga lebih cenderung menggunakan @Qualifier?

-parameters Gunakan untuk memastikan definisi dan menghapuskan kekaburan, supaya kedua -dua pemaju dan kerangka dapat dengan jelas niat. @Qualifier

Contoh:

Dengan cara ini, musim bunga boleh mengetahui dengan tepat kacang mana yang disuntik, tanpa mengira nama parameter atau faktor lain.

musim bunga harus lebih pintar?

Sesetengah orang mungkin berfikir bahawa rangka kerja seperti musim bunga harus lebih pintar, dan nama kacang secara automatik dipadankan dengan nama parameter apabila terdapat kekaburan. Tetapi:

  1. Keserasian belakang : Secara automatik mengubah tingkah laku ini boleh memusnahkan aplikasi sedia ada yang tidak sepadan dengan nama kacang dan nama parameter.
  2. Predictability
  3. : secara eksplisit menyelesaikan kekaburan (contohnya, melalui ) untuk memastikan pemaju sentiasa tahu kacang mana yang disuntik. Andaian reakable boleh menyebabkan kesukaran dalam debugging, terutamanya dalam aplikasi kompleks yang besar. @Qualifier
  4. keadaan di tempat sebenar

dalam kebanyakan aplikasi sebenar:

Pemaju menggunakan nama kacang dan nama parameter yang bermakna, tetapi mereka juga lebih suka memilih
    untuk memastikan kejelasan mereka.
  • @Qualifier untuk adegan berbilang contoh,
  • konfigurasi secara dinamik
  • atau kaedah berasaskan kilang (contohnya abstractroutaratasorce), bukannya menghubungkan secara manual setiap kacang.
  • mata utama

Spring pertama menyuntik dengan jenis

    : Jika hanya ada satu jenis kacang, musim bunga akan menyuntiknya tanpa sebarang masalah. Sekiranya terdapat banyak kacang jenis yang sama, musim bunga memerlukan petikan tambahan (seperti
  1. ) untuk menyelesaikan kekaburan. Nama parameter tidak boleh dipercayai. Walaupun nama parameter (@Qualifier) dikekalkan, musim bunga akan mengelakkan pencocokan padanan yang terkenal, kecuali konfigurasi adalah jelas.
  2. Eksplisit adalah lebih baik daripada tersembunyi : Pertimbangan keutamaan musim bunga boleh diramalkan, dan menggalakkan pemaju menggunakan konfigurasi eksplisit (seperti atau -parameters) dan bukannya bergantung pada padanan tersembunyi.
  3. Konsep Reka Bentuk Spring : Kesilapan Misty dapat menghalang kemalangan dan memastikan pemaju sepenuhnya mengawal suntikan pergantungan. @Qualifier

Atas ialah kandungan terperinci Spring-: Why-Spring-Cannot-Match-by-Name-For-Injection. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn