2.1 获取 beanName
代码如下:
1 |
// AbstractBeanFactory.java final String beanName = transformedBeanName(name); |
---|
这段代码的作用:这里传递的是 name
方法,不一定就是 beanName,可能是 aliasName ,也有可能是 FactoryBean ,所以这里需要调用 #transformedBeanName(String name)
方法,对 name
进行一番转换。
1 |
// AbstractBeanFactory.java protected String transformedBeanName(String name) { |
---|
这里的转换过程包括两部分,一是去除 FactoryBean 的修饰符,二是取指定的 alias
所表示的最终 beanName 。详细分析如下:
- 调用
BeanFactoryUtils#transformedBeanName(String name)
方法,去除 FactoryBean 的修饰符。代码如下:
// BeanFactoryUtils.java
private static final Map<String, String> transformedBeanNameCache = new ConcurrentHashMap<>();
public static String transformedBeanName(String name) {
Assert.notNull(name, "'name' must not be null");
if (!name.startsWith(BeanFactory.FACTORY_BEAN_PREFIX)) {
return name;
}
// BeanFactory.FACTORY_BEAN_PREFIX = "&"
// 就是去除传入 name 参数的 "&" 的前缀。
// computeIfAbsent 方法是jdk的代码,分成两种情况:
// 1. 未存在,则进行计算执行,并将结果添加到缓存。
// 2. 已存在,则直接返回,无需计算。
return transformedBeanNameCache.computeIfAbsent(name, beanName -> {
do {
beanName = beanName.substring(BeanFactory.FACTORY_BEAN_PREFIX.length());
}
while (beanName.startsWith(BeanFactory.FACTORY_BEAN_PREFIX));
return beanName;
});
}
public String canonicalName(String name) {
String canonicalName = name;
String resolvedName;
// 循环,从 aliasMap 中,获取到最终的 beanName
do {
resolvedName = this.aliasMap.get(canonicalName);
if (resolvedName != null) {
canonicalName = resolvedName;
}
}
while (resolvedName != null);
return canonicalName;
}
主要是一个循环获取 beanName 的过程,例如,别名 A 指向名称为 B 的 bean 则返回 B;若 别名 A 指向别名 B,别名 B 指向名称为 C 的 bean,则返回 C。
正文完