加入收藏 | 设为首页 | 会员中心 | 我要投稿 我爱故事小小网_铜陵站长网 (http://www.0562zz.com/)- 视频终端、云渲染、应用安全、数据安全、安全管理!
当前位置: 首页 > 教程 > 正文

Spring源码解析 - AbstractBeanFactory 达成接口与父类分析

发布时间:2021-11-18 20:59:42 所属栏目:教程 来源:互联网
导读:除了BeanFactory这一支的接口,AbstractBeanFactory主要实现了AliasRegistry和SingletonBeanRegistry接口. 这边主要提供了这样的三个功能: 别名管理,单例创建与注册,工厂方法FactoryBean支持. 我们来看看这些接口,类的主要职责吧: BeanFactory Spring IOC容器

除了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接口体系解读>里已经分析过,有兴趣可以看下http://www.linuxidc.com/Linux/2016-03/129118.htm.
 
我们今天主要分析其他的三个职责,如下的接口与类(顺便做目录):
 
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的接口,具体实现需要靠注入

(编辑:我爱故事小小网_铜陵站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读