AbstractBeanFactory 实现接口与父类分析

我们先来看类图吧:

除了BeanFactory这一支的接口,AbstractBeanFactory主要实现了AliasRegistry和SingletonBeanRegistry接口.

这边主要提供了这样的三个功能: 别名管理,单例创建与注册,工厂方法FactoryBean支持.

AbstractBeanFactory 实现接口与父类分析

我们来看看这些接口,类的主要职责吧:

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的别名管理

提供别名的注册,查找,删除,判断定义.

看个类图就行,不用展开.

AbstractBeanFactory 实现接口与父类分析

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)

AbstractBeanFactory 实现接口与父类分析

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的接口,具体实现需要靠注入

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/6882d41fc2f9ce16e463708a102fcdad.html