在Spring配置文件中的<bean>元素上使用id属性和name属性之间有什么区别吗?
在Spring参考中,3.2.3.1命名bean:
Every bean has one or more ids (also called identifiers, or names; these terms refer to the same thing). These ids must be unique within the container the bean is hosted in. A bean will almost always have only one id, but if a bean has more than one id, the extra ones can essentially be considered aliases. When using XML-based configuration metadata, you use the 'id' or 'name' attributes to specify the bean identifier(s). The 'id' attribute allows you to specify exactly one id, and as it is a real XML element ID attribute, the XML parser is able to do some extra validation when other elements reference the id; as such, it is the preferred way to specify a bean id. However, the XML specification does limit the characters which are legal in XML IDs. This is usually not a constraint, but if you have a need to use one of these special XML characters, or want to introduce other aliases to the bean, you may also or instead specify one or more bean ids, separated by a comma (,), semicolon (;), or whitespace in the 'name' attribute.
因此id属性基本上符合XML id属性标准,而name稍微灵活一些。一般来说,我几乎只使用名字。只是看起来更“春意盎然”。
任何一个都可以。这取决于你的需要: 如果您的bean标识符包含特殊字符(例如(/viewSummary.html)),则不允许将其作为bean id,因为它不是有效的XML id。在这种情况下,您可以跳过定义bean id,而是提供bean名称。 name属性还有助于为bean定义别名,因为它允许为给定bean指定多个标识符。
从Spring 3.1开始,id属性是一个xsd:string,并且允许与name属性相同的字符范围。
id和名称之间的唯一区别是名称可以包含多个别名,用逗号、分号或空格分隔,而id必须是单个值。
在Spring 3.2文档中:
In XML-based configuration metadata, you use the id and/or name attributes to specify the bean identifier(s). The id attribute allows you to specify exactly one id. Conventionally these names are alphanumeric ('myBean', 'fooService', etc), but may special characters as well. If you want to introduce other aliases to the bean, you can also specify them in the name attribute, separated by a comma (,), semicolon (;), or white space. As a historical note, in versions prior to Spring 3.1, the id attribute was typed as an xsd:ID, which constrained possible characters. As of 3.1, it is now xsd:string. Note that bean id uniqueness is still enforced by the container, though no longer by XML parsers.
在ApplicationContext xml中定义Id和名称有区别吗?没有 从3.1(spring)开始,id也被定义为xsd:string类型。 这意味着在定义name时允许的任何字符在Id中也被允许。 这在Spring 3.1之前是不可能的。
当name和Id相同时,为什么要使用name ? 它在某些情况下是有用的,例如允许应用程序中的每个组件通过使用特定于该组件本身的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" />
让我来回答下面的问题
在<bean>标记上使用id属性和使用name属性之间有任何区别吗?
没有区别。当在<bean>标记上使用id或name时,您将遇到相同的效果。
How?
id和name属性都为我们提供了一种向bean提供标识符值的方法(此时,id表示id,而不是标识符)。在这两种情况下,如果调用applicationContext.getBean("bean-identifier");.
以<bean>标记的java等效的@Bean为例,您不会找到id属性。您只能通过name属性将标识符值提供给@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
id和name都是Spring IOC容器/ applicationcontext中的bean标识符。id属性允许您精确地指定一个id,但是使用name属性可以为该bean指定别名。
你可以在这里查看春季医生。
推荐文章
- Spring-MVC控制器中的404触发器?
- 在Spring配置文件中使用bean id和名称的区别
- 在执行JpaTest时无法找到@SpringBootConfiguration
- 如何获得当前屏幕方向?
- 如何POST表单数据与Spring RestTemplate?
- 在哪里放置和如何在基于servlet的应用程序读取配置资源文件?
- 如何在Spring中以编程方式获取当前活动/默认环境概要文件?
- 使用Spring RestTemplate获取JSON对象列表
- 我如何模拟一个自动连接的@值字段在春季与Mockito?
- 获取Spring应用程序背景信息
- @Mock, @MockBean和Mockito.mock()的区别
- Intellij错误地表示没有为自动连接存储库找到类型的bean
- 为什么我的春季启动应用程序总是在启动后立即关闭?
- Spring Boot中的Spring .jpa.open-in-view=true属性是什么?
- 如何在Spring RestTemplate请求上设置“接受:”头?