在Spring配置文件中使用bean id和name之间的区别

时间:2009-05-17 12:23:45

标签: spring configuration

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

6 个答案:

答案 0 :(得分:126)

来自Spring reference3.2.3.1 Naming Beans

  

每个bean都有一个或多个id(也是   被称为标识符或名称;这些   术语指同一件事)。这些   id必须是唯一的   bean托管在容器中   bean几乎总是只有一个   id,但是如果bean有多个   id,额外的基本上可以   考虑别名。

     

使用基于XML的配置时   元数据,您使用'id'或'name'   用于指定bean的属性   身份标识)。 'id'属性   允许您指定一个id,   因为它是一个真正的XML元素ID   属性,XML解析器能够   在其他时做一些额外的验证   元素引用id;就这样,它   是指定bean的首选方法   ID。但是,XML规范   确实限制了那些字符   XML ID合法。这通常不是   约束,但如果你有需要   使用这些特殊的XML之一   人物,还是想介绍其他   bean的别名,你也可以   而是指定一个或多个bean ID,   用逗号(,),分号分隔   (;),或'name'中的空格   属性。

所以基本上id属性符合XML id属性标准,而name更灵活一些。一般来说,我几乎只使用name。它似乎更像是“春天”。

答案 1 :(得分:75)

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

idname之间的唯一区别是name可以包含由逗号,分号或空格分隔的多个别名,而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解析器。

答案 2 :(得分:46)

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

答案 3 :(得分:1)

定义Id&amp;是否有区别ApplicationContext xml中的名称?没有     从3.1(spring)开始,id也被定义为xsd:string类型。     这意味着在Id中也允许定义名称中允许的任何字符。     这在春季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" />

答案 4 :(得分:1)

  

标记上使用id属性和name属性是否有任何区别

几乎没有细微的差别,例如,如果处理不当,使用id会引发异常。
让我回答以下问题

  

标记上使用id 属性和使用名称属性之间是否有区别,

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

如何?

id和name属性都为我们提供了一种为特定bean提供标识符的方法(目前,认为id表示id而不是标识符)。您可以选择任何属性来提供标识符值。在这两种情况下,如果调用applicationContext.getBean("bean-identifier"); ,都会看到相同的结果。

采用@ Bean,Java等效于标记,没有id属性。您只能通过name属性提供标识符值。

让我通过一个示例进行解释,考虑下面的代码来获取bean,

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 f = (Foo) context.getBean("foo");的Foo对象

在上面的spring1.xml中用id="foo"

替换name="foo"

您仍然可以看到相同的结果,
Spring返回 Foo f = (Foo) context.getBean("foo");

的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'。
如果
,则会引发相同的异常。   
  
作为配置传递

如果将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>

以下代码显示为真

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 :(得分:0)

idname都是Spring IOC容器/ ApplicationContecxt中的bean标识符。通过id属性,您可以确切地指定一个id,但是使用name属性,可以为该bean指定别名。

您可以在此处检查弹簧doc