用到的Student类
public class Student {
private String name;
public void setName(String name){
this.name=name;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
'}';
}
}
一、配置bean的时候,可以不设置id,也可以不设置name,Spring会默认的使用类的全限定名作为bean的唯一标识符。
<bean class="com.SEVEN.IDNAME.Student">
<property name="name" value="张五月"></property>
</bean>
ApplicationContext ctx =new ClassPathXmlApplicationContext("applicationContext.xml");
//当配置bean时候没有指定id和name时,spring默认使用类的全限定名作为bean的唯一标识符
Student student = (Student)ctx.getBean(Student.class.getCanonicalName());
System.out.println(student);
输出:Student{name='张五月'}
二、如果配置bean时,只设置了id属性,那么id就是作为bean的唯一标识符,且id在spring容器中必须唯一。
<bean id="student1" class="com.SEVEN.IDNAME.Student">
<property name="name" value="SEVEN"></property>
</bean>
ApplicationContext ctx =new ClassPathXmlApplicationContext("applicationContext.xml");
Student student1 = (Student)ctx.getBean("student1");
System.out.println(student1);
输出:Student{name='SEVEN'}
三、如果配置bean时,没有设置id属性,只设置了name属性,那么name属性就是作为bean的唯一标识符,且name的值在spring容器中必须唯一。
<bean name="student2" class="com.SEVEN.IDNAME.Student">
<property name="name" value="张七月"></property>
</bean>
ApplicationContext ctx =new ClassPathXmlApplicationContext("applicationContext.xml");
Student student2 = (Student)ctx.getBean("student2");
System.out.println(student2);
输出:Student{name='张七月'}
四、如果同时设置了id和name属性,那么id设置的即为唯一标识符,name设置的是别名。
<bean id="student3" name="student33" class="com.SEVEN.IDNAME.Student">
<property name="name" value="张八月"></property>
</bean>
ApplicationContext ctx =new ClassPathXmlApplicationContext("applicationContext.xml");
Student student3 = (Student)ctx.getBean("student3");
System.out.println(student3);
String[] student3name = ctx.getAliases("student3");
System.out.println("student3的别名为:");
for(String s:student3name)
{
System.out.println(s);
}
输出:
Student{name='张八月'}
student3的别名为:
student33
五、如果同时设置了id和name属性,并且id和name的值相同,spring容器会自动检测并消除冲突,这个bean就只会有标识符,而没有别名。
<bean id="student4" name="student4" class="com.SEVEN.IDNAME.Student">
<property name="name" value="张九月"></property>
</bean>
ApplicationContext ctx =new ClassPathXmlApplicationContext("applicationContext.xml");
Student student4 = (Student)ctx.getBean("student4");
System.out.println(student4);
String[] student4name = ctx.getAliases("student4");
System.out.println("student4的别名个数为:"+student4name.length);
输出:
Student{name='张九月'}
student4的别名个数为:0
六、如果没有设置id,而name属性设置了多个值,那么name的第一个值会被用作标识符,其他的值被视为别名。如果设置了id,那么name的所有值都是别名。
<bean name="student5 student6 student7 student8" class="com.SEVEN.IDNAME.Student">
<property name="name" value="张十月"></property>
</bean>
ApplicationContext ctx =new ClassPathXmlApplicationContext("applicationContext.xml");
Student student5 = (Student)ctx.getBean("student5");
System.out.println(student4);
String[] student5name = ctx.getAliases("student5");
System.out.println("student5的别名为:");
for(String s:student5name)
{
System.out.println(s);
}
System.out.println("student5的别名个数为:"+student5name.length);
输出:
Student{name='张九月'}
student5的别名为:
student6
student8
student7
student5的别名个数为:3
注意:
(1)不管是标识符,还是别名,在容器中必需唯一。因为标识符和别名,都是可以用来获取bean的,如果不唯一,显然不知道获取的到底是哪一个bean。
(2)标识符和别名没有任何区别,id和name属性唯一的差别在于:id只能设置一个值,而name可以设置多个值。