Чи є різниця між використанням id
атрибута та name
атрибута для <bean>
елемента у файлі конфігурації Spring?
Чи є різниця між використанням id
атрибута та name
атрибута для <bean>
елемента у файлі конфігурації Spring?
Відповіді:
З посилань на весну , 3.2.3.1 Називання квасолі :
Кожен боб має один або декілька ідентифікаторів (їх також називають ідентифікаторами або іменами; ці терміни стосуються одного і того ж). Ці ідентифікатори повинні бути унікальними в контейнері, в якому розміщується боб. Бін майже завжди матиме лише один ідентифікатор, але якщо в бобі є більше одного ідентифікатора, додаткові можуть по суті вважатися псевдонімами.
Використовуючи метадані конфігурації на основі XML, ви використовуєте атрибути 'id' або 'name' для вказівки ідентифікаторів (-ів) біна. Атрибут 'id' дозволяє вказати саме один ідентифікатор, а оскільки це реальний атрибут ідентифікатора елементів XML, аналізатор XML може зробити додаткову перевірку, коли інші елементи посилаються на ідентифікатор; як такий, це кращий спосіб вказати ідентифікатор квасолі. Однак специфікація XML обмежує символи, які є юридичними в ідентифікаторах XML. Зазвичай це не є обмеженням, але якщо у вас є необхідність використовувати один із цих спеціальних символів XML або хочете ввести інші псевдоніми до файлу, ви також можете або замість цього вказати один або декілька ідентифікаторів бобів, розділених комою (, ), крапка з комою (;) або пробіл в атрибуті 'name'.
Тому в основному id
атрибут відповідає стандартам атрибутів XML id, тоді name
як трохи більш гнучким. Взагалі кажучи, я використовую name
досить ексклюзивно. Просто здається більше "Весна-у".
Починаючи з весни 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.
Будь-хто працював би. Це залежить від ваших потреб:
Якщо ваш ідентифікатор біна містить спеціальні символи, наприклад ( /viewSummary.html
), його не можна дозволити як bean id
, оскільки це не є дійсним ідентифікатором XML. У таких випадках ви можете пропустити визначення квасолі id
і поставити name
замість неї. Атрибут також допомагає у визначенні ес для бобу, так як він підтримує більше ідентифікаторів для даного компонента.name
alias
Чи є різниця між використанням атрибута 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
Чи є різниця у визначенні 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" />
Обидва id
і name
є ідентифікаторами квасолі у контейнері Spring / IOC Spring / ApplicationContecxt. id
Атрибут дозволяє точно вказати один ідентифікатор , але з допомогою name
атрибута можна вказати ім'я псевдоніма для цього компонента.
Ви можете перевірити весняний документ тут.