我们先来看类图吧:
除了BeanFactory这一支的接口,AbstractBeanFactory主要实现了AliasRegistry和SingletonBeanRegistry接口.
这边主要提供了这样的三个功能: 别名管理,单例创建与注册,工厂方法FactoryBean支持.
我们来看看这些接口,类的主要职责吧:
BeanFactory Spring IOC容器的根接口
-- HierachicalBeanFactory 实现容器的继承,就是可以有父 BeanFactory
-- -- ConfigureabelBeanFactory 提供factory的配置功能
AliasRegistry 定义bean name的别名管理
-- SimpleAliasRegistry 在实现别名管理接口基础上,添加一个canonicalName查找类真是名称api
SingletonBeanRegistry 提供单例注册,查询服务
-- DefaultSingletonBeanRegistry 实现单例与DisposableBean的生命周期管理(创建,维护,销毁)
-- -- FactoryBeanRegistrySupport 添加工厂方式创建类FactoryBean的支持
-- -- -- AbstractBeanFactory BeanFactory的抽象实现.
也就是说这边可以分为这样几类职责:
a, 类别名管理
b, 单例生命周期管理
c, 工厂方法初始化类对应的FactoryBean
d, BeanFactory容器
BeanFactory容器的职责(BeanFactory,HierachicalBeanFactory,ConfigureableBeanFactory)在上一篇文章<Spring源码解析 - BeanFactory接口体系解读>里已经分析过,有兴趣可以看下.
我们今天主要分析其他的三个职责,如下的接口与类(顺便做目录):
1. AliasRegistry 定义bean name的别名管理
2. SimpleAliasRegistry 实现别名管理接口
3. SingletonBeanRegistry 提供单例注册,查询服务
4. DefaultSingletonBeanRegistry 实现单例与DisposableBean的生命周期管理(创建,维护,销毁)
5. FactoryBeanRegistrySupport 添加工厂方式创建类FactoryBean的支持
1. AliasRegistry 定义bean name的别名管理
提供别名的注册,查找,删除,判断定义.
看个类图就行,不用展开.
2. SimpleAliasRegistry 实现别名管理接口
这边除了实现接口定义的api,还添加了两个公共api:
批量校验别名public void resolveAliases(StringValueResolver valueResolver)和查找别名对应的原始类名public String canonicalName(String name)
这边以别名为key缓存数据.
1 /** Map from alias to canonical name */ 2 private final Map<String, String> aliasMap = new ConcurrentHashMap<String, String>(16);
分析下api实现逻辑吧:
2.1 别名注册 registerAlias(String name, String alias)
2.2 删除别名public void removeAlias(String alias)
校验下,如果别名不存在报错:throw new IllegalStateException("No alias '" + alias + "' registered");
2.3 判断别名是否存在
直接使用ConcurrentHashMap的containsKey
2.4 获取别名public String[] getAliases(String name)
主要逻辑是加了个锁,然后是递归调用retrieveAliases,查找多层次的别名(就是查找别名的别名这些下去)
2.5 使用StringValueResolver解析类名,别名后,进行循环依赖的校验
这边使用的是StringValueResolver的接口,具体实现需要靠注入