`

Spring配置中<bean>的id和name属性区别

阅读更多
在BeanFactory的配置中,<bean>是我们最常见的配置项,它有两个最常见的属性,即id和name,最近研究了一下,发现这两个属性还挺好玩的,特整理出来和大家一起分享。
1.id属性命名必须满足XML的命名规范,因为id其实是XML中就做了限定的。总结起来就相当于一个Java变量的命名:不能以数字,符号打头,不能有空格,如123,?ad,"ab "等都是不规范的,Spring在初始化时就会报错,诸如:


代码
org.xml.sax.SAXParseException: Attribute value "?ab" of type ID must be a name.


2.name属性则没有这些限定,你可以使用几乎任何的名称,如?ab,123等,但不能带空格,如"a b"," abc",,这时,虽然初始化时不会报错,但在getBean()则会报出诸如以下的错误:


代码
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'a b' is defined


3.配置文件中不允许出现两个id相同的<bean>,否则在初始化时即会报错,如:


代码
org.xml.sax.SAXParseException: Attribute value "aa" of type ID must be unique within the document.

4.但配置文件中允许出现两个name相同的<bean>,在用getBean()返回实例时,后面一个Bean被返回,应该是前面那 个<bean>被后面同名的 <bean>覆盖了。有鉴于此,为了避免不经意的同名覆盖的现象,尽量用id属性而不要用name属性。

5.name属性可以用,隔开指定多个名字,如<bean name="b1,b2,b3">,相当于多个别名,这时通过getBean("a1") getBean("a2") getBean("a3")返回的都是同一个实例(假设是singleton的情况)

6.如果id和name都没有指定,则用类全名作为name,如<bean class="com.stamen.BeanLifeCycleImpl">,则你可以通过
getBean("com.stamen.BeanLifeCycleImpl")返回该实例。

7.如果存在多个id和name都没有指定,且实例类都一样的<bean>,如:


代码
<bean class="com.stamen.BeanLifeCycleImpl"/>
<bean class="com.stamen.BeanLifeCycleImpl"/>
<bean class="com.stamen.BeanLifeCycleImpl"/>

则第一个bean通过getBean("com.stamen.BeanLifeCycleImpl")获得,
第二个bean通过getBean("com.stamen.BeanLifeCycleImpl#1")获得,
第三个bean通过getBean("com.stamen.BeanLifeCycleImpl#2")获得,以此类推。

[小结]
当然,这些都是小技巧,不足以去实践,通过id指定唯一名称才是阳光大道,其他仅作为一笑而过的见闻罢了。
分享到:
评论
1 楼 jinnianshilongnian 2012-03-31  
id能进行SAX解析ID验证,name不行。

name在使用如springMVC时有用 因为可能指定URL path 如name=“/test”

相关推荐

    spring bean XML配置入门

    在本文中,我们将深入探讨Spring框架中的Bean XML配置,这是Spring的核心特性之一,它允许我们定义、管理和装配应用中的对象。我们将围绕以下知识点展开: 1. **Spring框架基础**: Spring是一个开源的Java平台,...

    spring bean 属性总结

    Spring的`&lt;beans&gt;`和`&lt;bean&gt;`元素及其属性提供了强大的配置能力,使开发者能够灵活地定义、配置和管理应用程序中的组件。通过深入了解这些元素和属性,开发人员可以更有效地利用Spring框架的功能,构建更加健壮和可...

    Spring3.2.4+Quartz2.2.0 Demo

    &lt;bean name="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"&gt; &lt;property name="triggers"&gt; &lt;list&gt; &lt;ref bean="myJobTrigger" /&gt; ...

    spring Ioc容器配置

    &lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt; &lt;property name="driverClassName"&gt; &lt;value&gt;org.gjt.mm.mysql.Driver&lt;/value&gt; &lt;/property&gt; &lt;property...

    SPRING:bean配置properties

    在Spring框架中,Bean的配置与管理是其核心功能之一,而通过`PropertyPlaceholderConfigurer`进行属性占位符的配置则是实现动态配置的关键技术。本文将深入解析如何利用`PropertyPlaceholderConfigurer`进行bean配置...

    spring-xmemcached

    &lt;bean id="cacheProxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean"&gt; &lt;property name="interceptorNames"&gt; &lt;list&gt; &lt;value&gt;cacheBeforeAdvice&lt;/value&gt; &lt;value&gt;cacheAfterAdvice&lt;/...

    Spring + Hibernate + Struts 事务配置小例子(带提示框等小技巧)

    &lt;property name="beanNames"&gt; &lt;!-- 下面是所有需要自动创建事务代理的bean--&gt; &lt;list&gt; &lt;value&gt;userManager&lt;/value&gt; &lt;/list&gt; &lt;!-- 此处可增加其他需要自动创建事务代理的bean--&gt; &lt;/property&gt; &lt;!...

    Spring (bean怎样注入值)学习实例

    本文将深入探讨如何在Spring中通过XML配置文件对Bean进行值的注入,包括List、Set和Map等集合类型的注入。 首先,我们需要了解Spring Bean的定义。在Spring中,Bean是一个被Spring容器管理的对象,它可以通过XML、...

    简单配置 shiro + spring +springMVC+hibernate简单框架

    &lt;bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"&gt; &lt;!-- 单realm应用。如果有多个realm,使用‘realms’属性代替 --&gt; &lt;property name="realm" ref=...

    java8+tomcat8+struts2.5+spring4.3+hibernate5.2框架搭建详细过程

    &lt;bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"&gt; &lt;property name="sessionFactory" ref="sessionFactory"/&gt; &lt;/bean&gt; &lt;tx:annotation-driven ...

    spring框架配置bean的高级属性

    本文将详细解读标题“spring框架配置bean的高级属性”以及描述中的内容,并结合具体的示例XML配置文件来探讨Bean配置中的高级技巧。 #### 核心概念与应用场景 在描述中提到的`hibernate tools`是一种用于简化...

    spring所有配置文件详解

    -- Bean属性配置 --&gt; &lt;property name="..." value="..." /&gt; ... &lt;/bean&gt; &lt;!-- 更多Bean定义 --&gt; ... &lt;/beans&gt; ``` - **根元素 `&lt;beans&gt;`**:定义Spring容器中的多个Bean实例。 - **子元素 `&lt;bean&gt;`**:用于...

    详解Spring的配置文件

    每个 `&lt;bean&gt;` 元素至少包含 `id` 和 `class` 属性。 - `id` 属性:标识 Bean 的唯一名称。 - `class` 属性:指定 Bean 的完整类名。 3. **属性注入**: - `&lt;property&gt;` 元素用于注入 Bean 的属性值。 - `...

    spring配置文件详解

    &lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt; &lt;property name="dataSource"&gt; &lt;ref bean="dataSource"/&gt; &lt;/property&gt; &lt;property name="mappingResources"&gt; ...

    spring定时任务

    &lt;bean id="sayHelloJob" class="org.springframework.scheduling.quartz.JobDetailBean"&gt; &lt;property name="jobClass"&gt; &lt;value&gt;com.test.Test&lt;/value&gt; &lt;/property&gt; &lt;/bean&gt; &lt;!-- 关键在如下两个触发器的...

    Spring中的参数注入.pdf

    通过&lt;value/&gt;元素可以指定属性或构造器参数的值,Spring容器会自动将字符串转换为实际的属性或参数类型后注入到Bean对象中。例如: ```xml &lt;bean id="student" class="com.ohmygod.entity.StudentInfo"&gt; &lt;property...

    05spring4_di.rar

    &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;beans xmlns="http://www.springframework.org/schema/beans" ... xmlns:p=... &lt;bean id="u1" class="cn.sxt.vo.User" c:name="Lynn" c:age="18"/&gt; &lt;/beans&gt;

    <Reslet1>:Reslet+Spring,配置简单web访问

    &lt;bean id="defaultHost" class="org.restlet.ext.spring.SpringHost"&gt; &lt;property name="defaultComponent" ref="defaultComponent" /&gt; &lt;/bean&gt; &lt;bean id="defaultComponent" class="org.restlet.Component"&gt; ...

    Spring+Mybatis+BoneCP配置实例

    &lt;bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"&gt; &lt;property name="dataSource" ref="dataSource"/&gt; &lt;property name="configLocation" value="classpath:mybatis-config.xml"/&gt; ...

Global site tag (gtag.js) - Google Analytics