<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="study.spring.bean.Bean" id="bean1" name="firstBean 1stBean"></bean>
<bean class="study.spring.bean.Bean" name="bean2;secondBean"></bean>
<bean class="study.spring.bean.Bean"></bean>
<alias name="firstBean" alias="bean2"></alias>
</beans>
spring 中 bean 可以定义别名,但是需要唯一,现在我定义了三个bean,并且给第一个 bean 起了个别名叫做 bean2,但是 bean2 已经是第二个bean的唯一标识了,为什么这么写不会报错?现在我从容器中获取 bean2 到底获取的是第一个 bean,还是第二个 bean?
首先回答第二个问题,获取的是哪个bean?
答:获取的是第一个bean
通过一个例子来说:
配置文件
定义两个空的bean:Bean1,Bean2
主函数:
打印结果:
再回答第一个问题,为什么没报错?
通过Debug来看,在` BeanFactory bf=new XmlBeanFactory(new ClassPathResource("resource.xml"));

之后查看一下
bf对象中的
aliasMap`属性。说明在问题在上一步中,继续深入
DefaultBeandDefinitionDocumentReader
这个方法解析的四个判断对应的就是
xml
配置文件中的四种默认标签,我们在此处打个断点,然后直接跳过,程序会再次回到这个断点,再次跳过。我们都可以猜到,第一第二次走的是
bean
分支,第三次走的是alias
分支。所以在第三次的时候进入观察为什么注册过程中没有报错。SimpleAliaRegistry
这次进的是2.1分支,别名的确是已经存在的,而且
not equals
所以继续检查是否允许别名重写,所以这里allowAliasOverriding
方法即是不报错的关键所在,这个方法默认返回值为true
。所以第一个问题的答案是:spring默认允许alias重写,所以不会报错。