spring中获取bean
在上面一章我们分析了AbstractBeanFactory中的doGetBean方法在上面有这个方法transformedBeanName
我们大概说了这个方法是进行名称转换来获取真正的类名称,其中包括别名转换,&特殊名称转换
具体代码如下:
protected String transformedBeanName(String name) { return canonicalName(BeanFactoryUtils.transformedBeanName(name)); }
很失望这里啥都没用做只是委托给了另一个方法区执行,我们可以发现这个英文名的解释是(规范的名称)
我们可以看到传入的name被BeanFactoryUtils中方法执行了一次
public static String transformedBeanName(String name) { Assert.notNull(name, "'name' must not be null"); String beanName = name; while (beanName.startsWith(BeanFactory.FACTORY_BEAN_PREFIX)) { beanName = beanName.substring(BeanFactory.FACTORY_BEAN_PREFIX.length()); } return beanName; }
上面这个方法我们只需知道
String FACTORY_BEAN_PREFIX = "&";
它上面就是在判断name是不是已&开头如果是我们就切割掉前面的&
接着我们看下面方法
public String canonicalName(String name) { String canonicalName = name; // Handle aliasing... String resolvedName; do { resolvedName = this.aliasMap.get(canonicalName); if (resolvedName != null) { canonicalName = resolvedName; } } while (resolvedName != null); return canonicalName; }
这个方法的功能就是用来判断传入的name是否为别名如果为别名就从别名缓存map中获取类名如果不是直接返回名称
到这里分析就已经完了,从上我们看到spring的分工是十分明确的每个方法只做自己应该的事:
transformedBeanName 解析掉&号
canonicalName 转换别名为类名