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的接口,具体实现需要靠注入 ![]() (编辑:我爱故事小小网_铜陵站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |