Answers:
每个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
几乎只使用。似乎更像是“春天”。
从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解析器执行。
任一个都会起作用。这取决于您的需求:
如果您的bean标识符包含特殊字符(例如(/viewSummary.html
)),则将其作为bean不允许使用id
,因为它不是有效的XML ID。在这种情况下,您可以跳过定义Bean的步骤id
,name
而是提供Bean 。
该name
属性还有助于alias
为您的bean 定义es,因为它允许为给定bean指定多个标识符。
在<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
在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" />