Perbedaan antara menggunakan id kacang dan nama dalam file konfigurasi Spring


205

Apakah ada perbedaan antara menggunakan idatribut dan nameatribut pada a<bean> elemen dalam file konfigurasi Spring?


8
sulit untuk datang dengan pertanyaan ini secara langsung dan jawaban yang begitu mudah dan komprehensif. Bagus. Terima kasih!
Peter Perháč

Jawaban:


129

Dari referensi Spring , 3.2.3.1 Kacang Penamaan :

Setiap kacang memiliki satu id atau lebih (juga disebut pengidentifikasi, atau nama; istilah ini merujuk pada hal yang sama). Id ini harus unik di dalam wadah yang menampung kacang. Kacang hampir selalu hanya memiliki satu id, tetapi jika kacang memiliki lebih dari satu id, yang ekstra pada dasarnya dapat dianggap sebagai alias.

Saat menggunakan metadata konfigurasi berbasis XML, Anda menggunakan atribut 'id' atau 'name' untuk menentukan pengenal kacang. Atribut 'id' memungkinkan Anda untuk menentukan secara tepat satu id, dan karena itu adalah atribut ID elemen XML nyata, parser XML dapat melakukan beberapa validasi tambahan ketika elemen lain mereferensikan id; dengan demikian, ini adalah cara yang disukai untuk menentukan id kacang. Namun, spesifikasi XML memang membatasi karakter yang sah dalam ID XML. Ini biasanya bukan kendala, tetapi jika Anda harus menggunakan salah satu karakter XML khusus ini, atau ingin memperkenalkan alias lain ke kacang, Anda juga dapat atau sebaliknya menetapkan satu atau lebih id kacang, dipisahkan dengan koma (, ), titik koma (;), atau spasi putih di atribut 'nama'.

Jadi pada dasarnya idatribut sesuai dengan standar atribut XML id sedangkan namesedikit lebih fleksibel. Secara umum, saya menggunakan namecukup banyak secara eksklusif. Sepertinya lebih "Spring-y".


46
Anda lebih suka menggunakan atribut "nama" meskipun referensi Spring yang Anda kutip merekomendasikan menggunakan atribut "id"? Bahkan jika Anda lebih suka menggunakan "nama", Anda tidak dapat menyebutnya lebih "Spring-y" jika referensi Spring menyarankan sebaliknya :) Ini adalah nitpicky, saya tahu;)
theadam

77

Sejak Spring 3.1 idatribut adalah xsd:stringdan memungkinkan rentang karakter yang sama dengan nameatribut.

Satu-satunya perbedaan antara a iddan a nameadalah bahwa a namedapat berisi beberapa alias yang dipisahkan oleh koma, titik koma, atau spasi putih, sedangkan a idharus berupa nilai tunggal.

Dari dokumentasi Spring 3.2:

Dalam metadata konfigurasi berbasis XML, Anda menggunakan atribut id dan / atau nama untuk menentukan pengenal kacang. Atribut id memungkinkan Anda menentukan secara tepat satu id. Secara konvensional nama-nama ini adalah alfanumerik ('myBean', 'fooService', dll), tetapi mungkin karakter khusus juga. Jika Anda ingin mengenalkan alias lain ke kacang, Anda juga bisa menentukannya di atribut nama, dipisahkan dengan koma (,), titik koma (;), atau spasi putih. Sebagai catatan historis, dalam versi sebelum Spring 3.1, atribut id diketik sebagai xsd: ID, yang membatasi karakter yang mungkin. Pada 3.1, sekarang xsd: string. Perhatikan bahwa keunikan id kacang masih diberlakukan oleh wadah, meskipun tidak lagi oleh parser XML.


48

Salah satu akan bekerja. Itu tergantung pada kebutuhan Anda:
Jika pengenal kacang Anda mengandung karakter khusus misalnya ( /viewSummary.html), itu tidak akan diizinkan sebagai kacang id, karena itu bukan ID XML yang valid. Dalam kasus seperti itu, Anda bisa melewatkan mendefinisikan kacang iddan memasok kacang namesebagai gantinya.
The nameatribut juga membantu dalam mendefinisikan aliases untuk kacang Anda, karena memungkinkan menentukan beberapa pengidentifikasi untuk kacang yang diberikan.


4
Ditambah satu untuk mengatakannya dengan kata-kata Anda sendiri dan memberikan contoh mengapa karakter khusus mungkin diperlukan.
Michael Piefel

Terima kasih. Menghargai itu.
pugmarx

3

Apakah ada perbedaan antara menggunakan atribut id dan atribut nama pada tag <bean>

Beberapa perbedaan kecil ada seperti, menggunakan id akan membuang pengecualian jika tidak ditangani dengan benar.
izinkan saya menjawab pertanyaan di bawah ini

Apakah ada perbedaan antara menggunakan atribut id dan menggunakan atribut nama pada tag <bean>,

Tidak ada perbedaan. Anda akan mengalami efek yang sama ketika id atau nama digunakan pada tag <bean>.

Bagaimana?

Atribut id dan nama memberi kita sarana untuk memberikan nilai pengenal kepada kacang (Untuk saat ini, pikirkan id berarti id tetapi bukan pengidentifikasi). Dalam kedua kasus, Anda akan melihat hasil yang sama jika Anda meneleponapplicationContext.getBean("bean-identifier"); .

Ambil @Bean, tag java yang setara dengan <bean>, Anda tidak akan menemukan atribut id. Anda dapat memberikan nilai pengenal Anda ke @Bean hanya melalui atribut nama.

Biarkan saya menjelaskannya melalui contoh:
Ambil file konfigurasi ini, sebut saja sebagai spring1.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
  <bean id="foo" class="com.intertech.Foo"></bean>
  <bean id="bar" class="com.intertech.Bar"></bean>
</beans>

Spring mengembalikan objek Foo untuk Foo f = (Foo) context.getBean("foo"); ,. Ganti id="foo"denganname="foo" di spring1.xml di atas, Anda masih akan melihat hasil yang sama.

Tentukan konfigurasi xml Anda seperti,

<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
  <bean id="fooIdentifier" class="com.intertech.Foo"></bean>
  <bean name="fooIdentifier" class="com.intertech.Foo"></bean>
</beans>

Anda akan mendapatkan BeanDefinitionParsingException. Itu akan mengatakan, nama Bean 'fooIdentifier' sudah digunakan dalam elemen ini. Ngomong-ngomong, ini adalah pengecualian yang sama yang akan Anda lihat jika Anda memiliki konfigurasi
<bean name = "fooIdentifier" class = "com.intertech.Foo"> </bean>
<bean > = bean name = "fooIdentifier" class = "com. intertech.Foo "> </bean>


Jika Anda menyimpan id dan nama pada tag bean, bean dikatakan memiliki 2 pengidentifikasi. Anda bisa mendapatkan kacang yang sama dengan pengenal apa pun. ambil config sebagai

<?xml version="1.0" encoding="UTF-8"?><br>
<beans ...>
  <bean id="fooById" name="fooByName" class="com.intertech.Foo"></bean>
  <bean id="bar" class="com.intertech.Bar"></bean>
</beans>

kode berikut ini mencetak true

FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext(...);
Foo fooById = (Foo) context.getBean("fooById")// returns Foo object;
Foo fooByName = (Foo) context.getBean("fooByName")// returns Foo object;
System.out.println(fooById == fooByName) //true

1

Apakah ada perbedaan dalam mendefinisikan Id & nama dalam ApplicationContext xml? No As 3.1 (spring), id juga didefinisikan sebagai xsd: tipe string. Itu berarti karakter apa pun yang diizinkan dalam mendefinisikan nama juga diizinkan dalam Id. Ini tidak mungkin dilakukan sebelum Musim Semi 3.1.

Mengapa menggunakan nama saat sama dengan Id? Ini berguna untuk beberapa situasi, seperti memungkinkan setiap komponen dalam aplikasi untuk merujuk pada ketergantungan umum dengan menggunakan nama kacang yang khusus untuk komponen itu sendiri.

For example, the configuration metadata for subsystem A may refer to a DataSource via the name subsystemA-dataSource. The configuration metadata for subsystem B may refer to a DataSource via the name subsystemB-dataSource. When composing the main application that uses both these subsystems the main application refers to the DataSource via the name myApp-dataSource. To have all three names refer to the same object you add to the MyApp configuration metadata the following 

<bean id="myApp-dataSource" name="subsystemA-dataSource,subsystemB-dataSource" ..../>

Alternatively, You can have separate xml configuration files for each sub-system and then you can make use of
alias to define your own names.

<alias name="subsystemA-dataSource" alias="subsystemB-dataSource"/>
<alias name="subsystemA-dataSource" alias="myApp-dataSource" />

0

Keduanya iddan namemerupakan pengidentifikasi kacang dalam wadah Spring IOC / ApplicationContecxt. The idatribut memungkinkan Anda menentukan tepat satu id tetapi menggunakanname atribut Anda dapat memberikan nama alias untuk kacang itu.

Anda dapat memeriksa dokumen pegas di sini.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.