`

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”

相关推荐

    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-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;!...

    简单配置 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=...

    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;!-- 关键在如下两个触发器的...

    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;

    Spring高版本对ibatis的支持

    最近想在最新的Spring5.0中集成ibatis(不是mybatis),发现已经不在支持SqlmapClientTemplate和SqlmapClientFactoryBean,于是搞了这个工具jar来进行支持如下配置 &lt;bean id="sqlMapClient" class="org.spring...

    springweb-Jackson

    &lt;ref bean="mappingJacksonHttpMessageConverter" /&gt; &lt;ref bean="stringHttpMessageConverter" /&gt; &lt;/list&gt; &lt;/property&gt; &lt;/bean&gt; &lt;bean id="mappingJacksonHttpMessageConverter" class="org.springframework...

    Spring

    &lt;bean id="bizImpl" class="org.nitpro.aop.impl.BizImpl"&gt;&lt;/bean&gt; &lt;bean id="invocation" class="org.springframework.aop.framework.ProxyFactoryBean"&gt; &lt;!--这里的必须要指定接口 --&gt; &lt;property name=...

    MethodInvokingJobDetailFactoryBean.java

    &lt;bean id="timerJob" class="job.TimerJob"&gt; &lt;/bean&gt; &lt;bean id="timerJobProxy" class="frameworkx.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"&gt; &lt;property name="target...

    spring applicationContext 配置文件

    &lt;bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate"&gt; &lt;property name="sqlMapClient"&gt; &lt;ref bean="sqlMapClient" /&gt; &lt;/property&gt; &lt;/bean&gt; &lt;!-- 配置要...

    jdbc——内嵌事务

    jdbc——内嵌事务 &lt;bean id="transactionManager" ...&lt;bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"&gt; &lt;property name="dataSource" ref="dataSource"/&gt; &lt;/bean&gt; &lt;/beans&gt;

    SSI框架整合实例

    &lt;bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"&gt; &lt;property name="dataSource" ref="dataSource"/&gt; &lt;property name="configLocation"&gt; &lt;value&gt;classpath:...

    ssh 整合的实例-----员工表的增删查改

    &lt;property name="username" value="root"&gt; &lt;/property&gt; &lt;property name="password" value="tarena"&gt; &lt;/property&gt; &lt;property name="url" value="jdbc:mysql://localhost:3306/test"&gt; &lt;/property&gt; ...

    Spring3中配置DBCP,C3P0,Proxool,Bonecp数据源

    在Spring3中配置数据源,包括DBCP,C3P0,Proxool,Bonecp主要的数据源,里面包含这些数据源的jar文件和依赖文件及配置文件。。 如Bonecp目前听说是最快的数据源,速度是传统的c3p0的25倍, bonecp.properties文件: ...

    MybatisPageHelper分页插件

    &lt;bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"&gt; &lt;property name="dataSource" ref="dataSource" /&gt; &lt;!-- 自动扫描mapping.xml文件 --&gt; &lt;property name="mapperLocations" ...

    Spring2.0+quartz1.8定时执行任务内含Cron表达式生成器

    &lt;bean id="runTime" class="org.springframework.scheduling.quartz.CronTriggerBean"&gt; &lt;property name="jobDetail"&gt; &lt;ref bean="runSyn" /&gt; &lt;/property&gt; &lt;property name="cronExpression"&gt; &lt;value&gt;0 0 2,17 *...

    javaSSH整合

    &lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"&gt; &lt;property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"&gt; &lt;/property&gt; &lt;property name="url" value="jdbc:...

    ssh框架在application.xml中配置数据源所需jar

    &lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt; &lt;property name="configLocation"&gt; &lt;value&gt;classpath:hibernate.cfg.xml&lt;/value&gt; &lt;/property&gt; &lt;/bean&gt; ...

Global site tag (gtag.js) - Google Analytics