获取真正的 beanName
// 我们在调用 getBean 方法的时候传递的 name 可以是 bean 的别名,也可以是获取 factoryBean 实例的 name,所以当我们以 name 为 key 检索 bean 的时候,首先需要获取 name 对应的唯一标识 bean 的真正名称 beanName,
// 这一过程位于 transformedBeanName(String name) 方法中:
//
protected String transformedBeanName(String name) {
return this.canonicalName(BeanFactoryUtils.transformedBeanName(name));
}
// 上述方法首先会通过 BeanFactoryUtils 工具类方法判断是不是获取 factoryBean,
// 如果是的话就去掉 name 前面的 “&” 字符,然后执行 canonicalName(String name) 逻辑:
//
public String canonicalName(String name) { // canonical:权威的
String canonicalName = name;
String resolvedName;
do {
resolvedName = this.aliasMap.get(canonicalName);
if (resolvedName != null) {
canonicalName = resolvedName;
}
// 遍历寻找真正的name,因为可能存在引用链
} while (resolvedName != null);
// 为什么这里当 resolvedName != null 的时候需要继续循环呢,
// 这是因为一个别名所引用的不一定是一个最终的 beanName,
// 可以是另外一个别名,这个时候就是一个链式引用的场景,
// 我们需要继续沿着引用链往下寻找最终的 beanName。
//这里返回得是一个规范得beanname
return canonicalName;
}
spring源码----获取BeanName《2》
最新推荐文章于 2023-08-04 13:37:46 发布