Різниця між використанням ідентифікатора біна та іменем у файлі конфігурації Spring


205

Чи є різниця між використанням idатрибута та nameатрибута для <bean>елемента у файлі конфігурації Spring?


8
важко підійти до питань, які є настільки простими, і відповіді настільки прості та всебічні. Чудово. Дякую!
Петро Пергач

Відповіді:


129

З посилань на весну , 3.2.3.1 Називання квасолі :

Кожен боб має один або декілька ідентифікаторів (їх також називають ідентифікаторами або іменами; ці терміни стосуються одного і того ж). Ці ідентифікатори повинні бути унікальними в контейнері, в якому розміщується боб. Бін майже завжди матиме лише один ідентифікатор, але якщо в бобі є більше одного ідентифікатора, додаткові можуть по суті вважатися псевдонімами.

Використовуючи метадані конфігурації на основі XML, ви використовуєте атрибути 'id' або 'name' для вказівки ідентифікаторів (-ів) біна. Атрибут 'id' дозволяє вказати саме один ідентифікатор, а оскільки це реальний атрибут ідентифікатора елементів XML, аналізатор XML може зробити додаткову перевірку, коли інші елементи посилаються на ідентифікатор; як такий, це кращий спосіб вказати ідентифікатор квасолі. Однак специфікація XML обмежує символи, які є юридичними в ідентифікаторах XML. Зазвичай це не є обмеженням, але якщо у вас є необхідність використовувати один із цих спеціальних символів XML або хочете ввести інші псевдоніми до файлу, ви також можете або замість цього вказати один або декілька ідентифікаторів бобів, розділених комою (, ), крапка з комою (;) або пробіл в атрибуті 'name'.

Тому в основному idатрибут відповідає стандартам атрибутів XML id, тоді nameяк трохи більш гнучким. Взагалі кажучи, я використовую nameдосить ексклюзивно. Просто здається більше "Весна-у".


46
Ви вважаєте за краще використовувати атрибут "name", навіть незважаючи на те, що весна посилання, яку ви цитували, рекомендує використовувати атрибут "id"? Навіть якщо ви віддаєте перевагу палиці з «ім'ям», ви не можете назвати це більш «Весна-у» , якщо Спрінг посилання передбачає інакше :) Це nitpicky, я знаю;)
theadam

77

Починаючи з весни 3.1, idатрибут - це xsd:stringта дозволяє такий же діапазон символів, що і nameатрибут.

Єдина відмінність між a idі a nameполягає в тому, що a nameможе містити кілька псевдонімів, розділених комою, крапкою з комою або пробілом, тоді як a idповинен бути єдиним значенням.

З документації Spring 3.2:

У метаданих конфігурації на основі XML ви використовуєте атрибути id та / або ім'я для вказівки ідентифікаторів (-ів) біна. Атрибут id дозволяє вказати саме один ідентифікатор. Зазвичай ці імена буквено-цифрові ('myBean', 'fooService' тощо), але можуть містити і спеціальні символи. Якщо ви хочете ввести до псевдоніму інші псевдоніми, ви також можете вказати їх у атрибуті імені, розділеному комою (,), крапкою з комою (;) або пробілом. Як історична примітка, у версіях до весни 3.1 атрибут id був набраний як xsd: ID, який обмежував можливі символи. Станом на 3.1, це тепер xsd: string. Зауважте, що унікальність ідентифікатора bean все ще застосовується контейнером, хоча вже не парсерами XML.


48

Будь-хто працював би. Це залежить від ваших потреб:
Якщо ваш ідентифікатор біна містить спеціальні символи, наприклад ( /viewSummary.html), його не можна дозволити як bean id, оскільки це не є дійсним ідентифікатором XML. У таких випадках ви можете пропустити визначення квасолі idі поставити nameзамість неї. Атрибут також допомагає у визначенні ес для бобу, так як він підтримує більше ідентифікаторів для даного компонента.
namealias


4
Плюс один - сказати це своїми словами та навести приклад, чому можуть знадобитися спеціальні символи.
Майкл Піефель

Дякую. Оцініть це.
pugmarx

3

Чи є різниця між використанням атрибута id та атрибута імені на тезі <bean>

Існує декілька незначних відмінностей, наприклад, використання id викине виняток, якщо не оброблятися належним чином.
дозвольте відповісти нижче на питання

Чи є різниця між використанням атрибута id та використанням атрибута імені на <bean> тезі,

Різниці немає. ви матимете такий самий ефект, коли в тегу <bean> буде використано id або ім'я.

Як?

І атрибути id, і ім'я дають нам засіб надати значення ідентифікатора бобу (на цей момент подумайте, що id означає id, але не ідентифікатор). В обох випадках ви побачите однаковий результат, якщо подзвоните applicationContext.getBean("bean-identifier"); .

Візьміть @Bean, еквівалент java тегу <bean>, ви не знайдете атрибут id. ви можете надати значення свого ідентифікатора @Bean лише за допомогою атрибута імені.

Дозвольте пояснити це на прикладі:
візьміть цей файл конфігурації, назвемо його як 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 повертає об'єкт Foo для, Foo f = (Foo) context.getBean("foo"); . Замінити id="foo"з name="foo"в вищевказаному spring1.xml, Ви будете бачити один і той же результат.

Визначте конфігурацію xml, як,

<?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>

Ви отримаєте BeanDefinitionParsingException. Він скаже, назва Bean 'fooIdentifier' вже використовується в цьому елементі. До речі, це той самий виняток, який ви побачите, якщо у вас нижче конфігурація
<bean name = "fooIdentifier" class = "com.intertech.Foo"> </bean>
<bean name = "fooIdentifier" class = "com. intertech.Foo "> </bean>


Якщо ви зберігаєте ідентифікатор і ім'я в тезі bean, вважається, що в bean є 2 ідентифікатори. ви можете отримати ту саму квасолю з будь-яким ідентифікатором. приймати конфігурацію як

<?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>

наступний код друкує 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

Чи є різниця у визначенні Id & name в ApplicationContext xml? Ні Станом на 3.1 (весна), id також визначається як тип рядка xsd: Це означає, що будь-які символи, дозволені у визначенні імені, також дозволені в Id. Це було неможливо до весни 3.1.

Навіщо використовувати ім'я, коли воно збігається з Id? Це корисно в деяких ситуаціях, наприклад, дозволяючи кожному компоненту в додатку посилатися на загальну залежність, використовуючи ім'я боба, яке є специфічним саме для цього компонента.

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

Обидва idі nameє ідентифікаторами квасолі у контейнері Spring / IOC Spring / ApplicationContecxt. idАтрибут дозволяє точно вказати один ідентифікатор , але з допомогою nameатрибута можна вказати ім'я псевдоніма для цього компонента.

Ви можете перевірити весняний документ тут.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.