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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

  Есть ли разница между использованием атрибута id и атрибута имени в & lt; bean & gt; тег

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

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

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

Как?

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

Возьмите @Bean, Java-эквивалент & lt; bean & gt; тег, вы не найдете атрибута 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
& lt; bean name = "fooIdentifier" class= "com.intertech.Foo" & gt; & lt;/bean & gt;
& lt; bean name = "fooIdentifier" class= "com.intertech.Foo" & gt; & lt;/bean & gt;


Если вы оставите и идентификатор, и имя в теге 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

Ответ 5

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