在Spring配置文件中使用bean ID和名称的区别


205

在Spring配置文件中的元素上使用id属性和name属性之间有什么区别<bean>吗?


8
很难提出如此直接的问题,而回答如此直接和全面的问题。大。谢谢!
PeterPerháč2011年

Answers:


129

Spring参考3.2.3.1命名豆类

每个bean具有一个或多个id(也称为标识符或名称;这些术语指的是同一件事)。这些ID在该bean所在的容器中必须唯一。一个bean几乎总是只有一个id,但是如果一个bean有多个id,则多余的ID本质上可以被视为别名。

使用基于XML的配置元数据时,可以使用'id'或'name'属性来指定Bean标识符。'id'属性允许您确切指定一个id,并且因为它是一个真正的XML元素ID属性,所以当其他元素引用该id时,XML解析器可以进行一些额外的验证。因此,这是指定bean ID的首选方法。但是,XML规范确实限制了XML ID中合法的字符。通常这不是一个约束,但是如果您需要使用这些特殊的XML字符之一,或者想为Bean引入其他别名,则也可以或者改为指定一个或多个Bean ID,并用逗号(, ),分号(;)或'name'属性中的空格。

因此,该id属性基本上符合XML id属性标准,name但更具灵活性。一般来说,我name几乎只使用。似乎更像是“春天”。


46
即使您引用的Spring参考建议使用“ id”属性,您还是更喜欢使用“ name”属性。即使您更喜欢使用“名称”,如果Spring参考另有建议,您也不能将其更称为“ Spring-y” :)我知道这很
挑剔

77

从Spring 3.1开始,该id属性为an,xsd:string并允许与该name属性相同的字符范围。

an id和a 之间的唯一区别name是,a name可以包含多个用逗号,分号或空格分隔的别名,而a id必须是单个值。

从Spring 3.2文档中:

在基于XML的配置元数据中,您使用id和/或name属性来指定Bean标识符。id属性允许您精确指定一个id。按照惯例,这些名称是字母数字(“ myBean”,“ fooService”等),但也可以是特殊字符。如果要向bean引入其他别名,还可以在name属性中指定它们,并用逗号(,),分号(;)或空格分隔。作为历史记录,在Spring 3.1之前的版本中,id属性被键入为xsd:ID,这限制了可能的字符。从3.1开始,它现在是xsd:string。请注意,Bean ID唯一性仍由容器强制执行,尽管不再由XML解析器执行。


48

任一个都会起作用。这取决于您的需求:
如果您的bean标识符包含特殊字符(例如(/viewSummary.html)),则将其作为bean不允许使用id,因为它不是有效的XML ID。在这种情况下,您可以跳过定义Bean的步骤idname而是提供Bean 。
name属性还有助于alias为您的bean 定义es,因为它允许为给定bean指定多个标识符。


4
再加上一个用您自己的话说出来的例子,并举例说明为什么可能需要特殊字符。
Michael Piefel '02

谢谢。欣赏它。
pugmarx

3

在<bean>标记上使用id属性和name属性之间有什么区别

存在一些细微的差别,例如,如果处理不当,使用id会引发异常。
让我回答以下问题

在<bean>标记上使用id属性和使用name属性之间有什么区别,

没有区别。在<bean>标记上使用id或name时,您将遇到相同的效果。

怎么样?

id和name属性都为我们提供了向bean提供标识符值的方法(目前,认为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"); 。在上述spring1.xml中替换id="foo"name="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。它将说,此元素中已经使用了Bean名称“ fooIdentifier”。顺便说一句,如果您在下面的配置
<bean name =“ fooIdentifier” class =“ com.intertech.Foo”> </ bean>
<bean name =“ fooIdentifier” class =“ com 之下,将看到相同的异常 。 intertech.Foo“> </ bean>


如果将id和name都保留在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

在ApplicationContext xml中定义Id和名称是否有区别?从3.1(spring)开始,id也定义为xsd:string类型。这意味着ID中也允许使用定义名称中允许的任何字符。在Spring 3.1之前这是不可能的。

为什么要使用与ID相同的名称?这在某些情况下很有用,例如允许应用程序中的每个组件通过使用特定于该组件本身的Bean名称来引用公共依赖项。

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

两者idname都是Spring IOC容器/ ApplicationContecxt中的bean标识符。该id属性可让您精确指定一个ID,但使用name属性可以为该bean提供别名。

您可以在此处查看spring doc

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.