的 id 和 name 属性区别
配置一个bean的时候,我们可以不设置id,也可以不设置name,spring默认会使用类的全限定名作为bean的标识符。
1
<bean class="net.aty.spring.ioc.first.C1"></bean>
1
2
3
4// 没有设置id,也没有设置name, 默认用类的全限定名
boolean same = ctx.getBean(C1.class) == ctx.getBean(C1.class
.getCanonicalName());
System.out.println(same);//true如果使用id属性来设置bean的标识符,那么id在spring容器中必需唯一。
如果使用name属性来设置,那么设置的其实就是bean的标识符,必需在容器中唯一。
1
<bean name="c1" class="net.aty.spring.ioc.first.C1"></bean>
1
2
3
4ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
"first-spring.xml");
System.out.println(ctx.getBean("c1",C1.class));
ctx.close();如果同时设置id和name,那么id设置的是标识符,name设置的是别名。
1
<bean id="cid" name="alias1" class="net.aty.spring.ioc.first.C1"></bean>
1
2
3
4
5
6
7
8
9
10ClassPathXmlApplicationContext 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只有标识符,而没有别名。
1
<bean id="cid" name="cid" class="net.aty.spring.ioc.first.C1"></bean>
1
2
3
4
5
6
7
8ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
"first-spring.xml");
String[] alias = ctx.getAliases("cid");
System.out.println(alias.length);//0
ctx.close();name属性设置多个值。不设置id,那么第一个被用作标识符,其他的被视为别名。如果设置了id,那么name的所有值都是别名。
1
<bean name="a1,a2,a3" class="net.aty.spring.ioc.first.C1"></bean>
1
2
3
4
5
6
7
8ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
"first-spring.xml");
String[] alias = ctx.getAliases("a1");
System.out.println(Arrays.toString(alias));//[a2, a3]
ctx.close();注意:不管是标识符,还是别名,在容器中必需唯一。因为标识符和别名,都是可以用来获取bean的,如果不唯一,显然不知道获取的到底是哪儿一个bean。
使用
标签指定别名,别名也必须在IoC容器中唯一。 1
2
3<bean id="c1" class="net.aty.spring.ioc.first.C1"></bean>
<alias name="c1" alias="1"/>
<alias name="c1" alias="2"/>1
2
3
4
5
6
7
8ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
"first-spring.xml");
String[] alias = ctx.getAliases("c1");
System.out.println(Arrays.toString(alias));//[1,2]
ctx.close();
总结: 标识符和别名没有任何区别,所以id和name属性唯一的差别在于:id只能设置一个标识符,而name可以设置多个标识符
1 | <bean id="c1" class="net.aty.spring.ioc.first.C1"></bean> |
1 | System.out.println(Arrays.toString(ctx.getAliases("c1")));//[1,2] |