人可以有很多称呼,但是你的定位符只能有一个,比如你可以叫小a小b小c,但是你的身份证号码是唯一的。bean也一样,bean的id是唯一的,名字可以有很多,下面分析一下各种情况。
①*bean既没有指定id,也没有指定name,则使用“全限定类名#编号*”当做类的id;如果有多个相同类的bean(同样是没有手动指定id和name的),则编号会从0开始递增,“全限定类名#0”的bean享受name为“全限定类名”。
import org.springframework.beans.factory.BeanNameAware;
public class IdBean implements BeanNameAware{
//这个其实是bean的id
public void setBeanName(String name) {
//打印出bean的id
System.out.println("IdBean:"+name);
}
}
xml中没有指定bean的id和name
<bean class="com.Chapter3.beanNameId.IdBean"></bean>
<bean class="com.Chapter3.beanNameId.IdBean"></bean>
<bean class="com.Chapter3.beanNameId.IdBean"></bean>
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:/com/Chapter3/beanNameId/BeanNameId.xml");
String[] aliais0 = ac.getAliases("com.Chapter3.beanNameId.IdBean#0");
System.out.println("#0:"+Arrays.toString(aliais0));
String[] aliais1 = ac.getAliases("com.Chapter3.beanNameId.IdBean#1");
System.out.println("#1:"+Arrays.toString(aliais1));
String[] aliais2 = ac.getAliases("com.Chapter3.beanNameId.IdBean#2");
System.out.println("#2:"+Arrays.toString(aliais2));
输出:
IdBean:com.Chapter3.beanNameId.IdBean#0
IdBean:com.Chapter3.beanNameId.IdBean#1
IdBean:com.Chapter3.beanNameId.IdBean#2
#0:[com.Chapter3.beanNameId.IdBean]
#1:[]
#2:[]
可以发现,bean的id按顺序依次被赋值为“全限定类名#0”,“全限定类名#1”,“全限定类名#2”。
可以验证下name为“全限定类名”的和id为“全限定类名#0”的bean是不是同一个:
//id为com.Chapter3.beanNameId.IdBean#0的bean和name为com.Chapter3.beanNameId.IdBean的bean是同一个
System.out.println(ac.getBean("com.Chapter3.beanNameId.IdBean#0") == ac.getBean("com.Chapter3.beanNameId.IdBean"));
输出为true,说明是同一个。
**②**bean只指定name不指定id,会把name当做id,剩下的name(除去当成id的那个)当成bean真正的name。
import org.springframework.beans.factory.BeanNameAware;
public class NameBean implements BeanNameAware{
//这个其实是bean的id
public void setBeanName(String name) {
System.out.println("NameBean:"+name);
}
}
只指定name:
<bean name="nameBean" class="com.Chapter3.beanNameId.NameBean"></bean>
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:/com/Chapter3/beanNameId/BeanNameId.xml");
String[] aliais0 = ac.getAliases("nameBean");
System.out.println(Arrays.toString(aliais0));
输出:
NameBean:nameBean
[]
可以看到id为nameBean,而bean的name消失了。可以举个有多个name的例子:
<bean name="nameBean,nameBean1,nameBean2,nameBean3" class="com.Chapter3.beanNameId.NameBean"></bean>
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:/com/Chapter3/beanNameId/BeanNameId.xml");
String[] aliais = ac.getAliases("nameBean");
System.out.println(Arrays.toString(aliais));
输出:
NameBean:nameBean
[nameBean3, nameBean2, nameBean1]
可以看到把第一个name当成id,其它name当成真正name。
③既指定了bean的id,也指定了bean的name。则id是id,name是name,互不影响。
import org.springframework.beans.factory.BeanNameAware;
public class NameIdBean implements BeanNameAware{
public void setBeanName(String name) {
System.out.println("NameIdBean:"+name);
}
}
<bean id="beanId" name="beanName1,beanName2,beanName3" class="com.Chapter3.beanNameId.NameIdBean"></bean>
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:/com/Chapter3/beanNameId/BeanNameId.xml");
String[] aliais = ac.getAliases("beanId");
System.out.println(Arrays.toString(aliais));
输出为:
NameIdBean:beanId
[beanName2, beanName1, beanName3]
④如果只指定了id,没有指定name,那容器不会主动为name设置值,name就是为空。
<bean id="beanId" class="com.Chapter3.beanNameId.NameIdBean"></bean>
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:/com/Chapter3/beanNameId/BeanNameId.xml");
String[] aliais = ac.getAliases("beanId");
System.out.println(Arrays.toString(aliais));
输出:
NameIdBean:beanId
[]