(Spring In Action)bean的name和id

人可以有很多称呼,但是你的定位符只能有一个,比如你可以叫小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
[]

猜你喜欢

转载自blog.csdn.net/a_842297171/article/details/79756077