spring配置文件中<bean>的id和name属性区别,以及identifier和aliases

Every bean has one or more identifiers. These identifiers must be unique within the container that hosts the bean. A bean usually has only one identifier, but if it requires more than one, the extra ones can be considered aliases.这是spring reference中的解释,标识符和别名本质上其实是相同的,都可以唯一地标识一个bean。


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. 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. 可以看出:id和name的本质区别:id只能定义1个identifier,而name可以定义多个aliases。


1.配置一个bean的时候,我们可以不设置id,也可以不设置name,spring默认会使用类的全限定名作为bean的标识符。

<bean class="net.aty.spring.ioc.first.C1"></bean>
// 没有设置id,也没有设置name, 默认用类的全限定名
boolean same = ctx.getBean(C1.class) == ctx.getBean(C1.class
		.getCanonicalName());
System.out.println(same);//true

2.如果使用id属性来设置bean的标识符,那么id在spring容器中必需唯一。


3.如果使用name属性来设置,那么设置的其实就是bean的标识符,必需在容器中唯一。

<bean name="c1" class="net.aty.spring.ioc.first.C1"></bean>
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
		"first-spring.xml");
System.out.println(ctx.getBean("c1",C1.class));
ctx.close();


4.如果同时设置id和name,那么id设置的是标识符,name设置的是别名。
<bean id="cid" name="alias1" class="net.aty.spring.ioc.first.C1"></bean>
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
		"first-spring.xml");

String[] alias = ctx.getAliases("cid");

for (String e : alias) {
	System.out.println(e);//alias1
}

ctx.close();


如果id和name的值相同,那么spring容器会自动检测并消除冲突:让这个bean只有标识符,而没有别名。
<bean id="cid" name="cid" class="net.aty.spring.ioc.first.C1"></bean>
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
		"first-spring.xml");

String[] alias = ctx.getAliases("cid");

System.out.println(alias.length);//0

ctx.close();

5.name属性设置多个值。不设置id,那么第一个被用作标识符,其他的被视为别名。如果设置了id,那么name的所有值都是别名。
<bean name="a1,a2,a3" class="net.aty.spring.ioc.first.C1"></bean>
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
		"first-spring.xml");

String[] alias = ctx.getAliases("a1");

System.out.println(Arrays.toString(alias));//[a2, a3]

ctx.close();
注意:不管是标识符,还是别名,在容器中必需唯一。因为标识符和别名,都是可以用来获取bean的,如果不唯一,显然不知道获取的到底是哪儿一个bean。

<bean id="c1" name="alias" class="net.aty.spring.ioc.first.C1"></bean>
<bean id="c2" name="alias" class="net.aty.spring.ioc.first.C2"></bean>



6.使用<alias>标签指定别名,别名也必须在IoC容器中唯一。

<bean id="c1" class="net.aty.spring.ioc.first.C1"></bean>
<alias name="c1" alias="1"/>
<alias name="c1" alias="2"/>
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
		"first-spring.xml");

String[] alias = ctx.getAliases("c1");

System.out.println(Arrays.toString(alias));//[1,2]

ctx.close();



最后看一段配置和代码:
<bean id="c1" class="net.aty.spring.ioc.first.C1"></bean>
<alias name="c1" alias="1"/>
<alias name="c1" alias="2"/>
System.out.println(Arrays.toString(ctx.getAliases("c1")));//[1,2]
System.out.println(Arrays.toString(ctx.getAliases("1")));//[c1,2]
System.out.println(Arrays.toString(ctx.getAliases("2")));//[c1,1]

System.out.println(ctx.getBean("c1") == ctx.getBean("1"));//true
System.out.println(ctx.getBean("c1") == ctx.getBean("2"));//true


可以看到:标识符和别名没有任何区别,所以id和name属性唯一的差别在于:id只能设置一个标识符,而name可以设置多个标识符separated by a comma (,), semicolon (;), or white space。


参考文章:

http://jinnianshilongnian.iteye.com/blog/1413857


  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值