在Spring配置文件中的id
元素上使用name
属性和<bean>
属性之间有什么区别吗?
答案 0 :(得分:126)
来自Spring reference,3.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
属性相同的字符范围。
id
和name
之间的唯一区别是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属性都为我们提供了一种为特定bean提供标识符的方法(目前,认为id表示id而不是标识符)。您可以选择任何属性来提供标识符值。在这两种情况下,如果调用applicationContext.getBean("bean-identifier");
,都会看到相同的结果。
采用@ Bean,Java等效于
让我通过一个示例进行解释,考虑下面的代码来获取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对象
id="foo"
替换name="foo"
您仍然可以看到相同的结果,
Spring返回 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,它将说,此名称中已使用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)
id
和name
都是Spring IOC容器/ ApplicationContecxt中的bean标识符。通过id
属性,您可以确切地指定一个id,但是使用name
属性,可以为该bean指定别名。
您可以在此处检查弹簧doc。