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();
<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();
<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