Разница между использованием идентификатора компонента и имени в конфигурационном файле Spring


205

Есть ли разница между использованием idатрибута и nameатрибута для <bean>элемента в файле конфигурации Spring?


8
трудно найти ответы на такие простые вопросы и ответы на такие простые и понятные вопросы. Отлично. Спасибо!
Петер Перхач

Ответы:


129

Из ссылки Spring , 3.2.3.1 Именование Beans :

Каждый компонент имеет один или несколько идентификаторов (также называемых идентификаторами или именами; эти термины относятся к одному и тому же). Эти идентификаторы должны быть уникальными в контейнере, в котором размещен бин. Боб почти всегда будет иметь только один идентификатор, но если у бина более одного идентификатора, дополнительные могут по существу считаться псевдонимами.

При использовании метаданных конфигурации на основе XML вы используете атрибуты 'id' или 'name' для указания идентификатора (ов) компонента. Атрибут 'id' позволяет вам указать ровно один идентификатор, и, поскольку он является настоящим атрибутом идентификатора элемента XML, анализатор XML может выполнять дополнительную проверку, когда другие элементы ссылаются на идентификатор; как таковой, это предпочтительный способ указать идентификатор компонента. Однако спецификация XML ограничивает символы, допустимые в идентификаторах XML. Обычно это не является ограничением, но если вам нужно использовать один из этих специальных символов XML или вы хотите ввести другие псевдонимы для компонента, вы также можете или вместо этого указать один или несколько идентификаторов компонента, разделенных запятой (, ), точка с запятой (;) или пробел в атрибуте name.

Таким образом, в основном idатрибут соответствует стандартам атрибутов XML id, тогда как nameон немного более гибкий. Вообще говоря, я использую в nameзначительной степени исключительно. Это только кажется больше "Spring-y".


46
Вы предпочитаете использовать атрибут "name", хотя цитируемая вами ссылка Spring рекомендует использовать атрибут "id"? Даже если вы предпочитаете придерживаться «имени», вы не можете назвать его более «Spring-y», если ссылка на Spring предполагает иное :) Это язвительно, я знаю;)
theadam

77

Начиная с Spring 3.1, idатрибут является xsd:stringи допускает тот же диапазон символов, что и nameатрибут.

Единственное отличие между a idи a nameсостоит в том, что a nameможет содержать несколько псевдонимов, разделенных запятой, точкой с запятой или пробелом, тогда как a idдолжно быть одним значением.

Из документации Spring 3.2:

В метаданных конфигурации на основе XML вы используете атрибуты id и / или name для указания идентификатора (ов) компонента. Атрибут id позволяет указать ровно один идентификатор. Обычно эти имена являются буквенно-цифровыми («myBean», «fooService» и т. Д.), Но также могут содержать специальные символы. Если вы хотите ввести другие псевдонимы в bean-компонент, вы также можете указать их в атрибуте name, разделяя их запятой (,), точкой с запятой (;) или пробелом. Как историческое примечание, в версиях до Spring 3.1 атрибут id был напечатан как xsd: ID, который ограничивал возможные символы. Начиная с версии 3.1 теперь это xsd: string. Обратите внимание, что уникальность идентификатора bean-компонента все еще обеспечивается контейнером, но больше не анализаторами XML.


48

Либо один будет работать. Это зависит от ваших потребностей:
если ваш идентификатор компонента содержит специальный символ (ы), например, ( /viewSummary.html), он не будет использоваться в качестве компонента id, поскольку он не является допустимым идентификатором XML. В таких случаях вы можете пропустить определение компонента idи nameвместо него предоставить компонент . Атрибут также помогает в определении эс для боба, так как он позволяет задать несколько идентификаторов для данного компонента.
namealias


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

Спасибо. Ценить это.
pugmarx

3

Есть ли разница между использованием атрибута id и атрибута name в теге <bean>

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

Есть ли разница между использованием атрибута id и использованием атрибута name в теге <bean>,

Нет никакой разницы. вы будете испытывать тот же эффект, когда идентификатор или имя используются в теге <bean>.

Как?

И атрибуты id, и name дают нам возможность предоставить бину значение идентификатора (на данный момент, думаю, id означает id, но не идентификатор). В обоих случаях вы увидите один и тот же результат, если позвонитеapplicationContext.getBean("bean-identifier"); .

Возьмите @Bean, Java-эквивалент тега <bean>, вы не найдете атрибута id. Вы можете передать свое значение @Bean только через атрибут name.

Позвольте мне объяснить это на примере:
возьмите этот файл конфигурации, давайте назовем его как 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. Он скажет, что в этом элементе уже используется имя компонента 'fooIdentifier'. Кстати, это то же исключение, которое вы увидите, если у вас ниже config
<bean name = "fooIdentifier" class = "com.intertech.Foo"> </ bean>
<bean name = "fooIdentifier" class = "com. intertech.Foo "> </ bean>


Если вы сохраняете id и name в теге 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

Есть ли разница в определении идентификатора и имени в ApplicationContext xml? Нет Начиная с версии 3.1 (весна), идентификатор также определяется как тип xsd: string. Это означает, что любые символы, разрешенные в определении имени, также разрешены в 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 / ApplicationContecxt. idАтрибут позволяет точно указать один идентификатор , но с использованиемname атрибута можно указать имя псевдонима для этого компонента.

Вы можете проверить весенний документ здесь.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.