Разница между использованием идентификатора и имени компонента в конфигурационном файле Spring - PullRequest
193 голосов
/ 17 мая 2009

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

Ответы [ 5 ]

126 голосов
/ 17 мая 2009

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

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

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

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

75 голосов
/ 02 марта 2013

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

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

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

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

46 голосов
/ 17 мая 2009

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

1 голос
/ 09 января 2019

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

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

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

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

Как?

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

Возьмите @Bean, java-эквивалент тега , атрибут id отсутствует. Вы можете указать значение идентификатора только через атрибут name.

Позвольте мне объяснить это на примере, рассмотрим следующий код для получения компонента,

FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext(...); Foo f = (Foo) context.getBean("foo")// returns Foo object;
Если конфигурация указана как
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

Вы все еще можете увидеть тот же результат,
Spring возвращает объект Foo для, Foo f = (Foo) context.getBean("foo");

Определите свою конфигурацию 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'.
Такое же исключение будет выдано, если


передается в качестве конфигурации

если вы сохраните и идентификатор, и имя в теге bean, говорят, что bean имеет 2 идентификатора, вы можете получить один и тот же bean с любым идентификатором. принять конфиг как

<?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 голос
/ 21 мая 2018

Есть ли разница в определении идентификатора и имени в ApplicationContext xml? нет Начиная с версии 3.1 (весна), id также определяется как тип 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" />
...