接着之前Spring的BeanFactory体系结构,再进行学习。这次我学习的是SimpleAliasRegistry。
SimpleAliasRegistry实现的是AliasRegistry,也就是提供了别名的注册场所。
AliasRegistry是一个通用的管理别名的接口,BeanDefinitionAliasRegistry接口就是继承此接口。
此接口定义的方法(服务)也很简单:
- registerAlias 注册一个别名
- removeAlias 删除别名
- isAlias 判断是否是别名
- getAliases 获得一个名字的所有别名,以String数组的形式返回
那它的实现SimpleAliasRegistry,其内部采用了一个ConcurrentHashMap来进行别名的存储。因为方法的数量比较少,所以分别对这四个方法进行详读。
void registarAlias(String name, String alias)
首先,会看看 name 是否和 alias 相等,如果相等,就把存储器中的 alias 删除。
然后,其内部还定义了一个 allowAliasOverriding 的方法来判断是否允许覆盖。子类可以复写此方法,调整其策略。
void removeAlias(String alias)
很容易理解,但是这里需要注意,如果这个alias找不到,那么程序是会直接抛异常的,而不是默默的忽略。这个点在接口中也有提到的。
boolean isAlias(String name)
判断其是否是别名。
String[] getAliases(String name)
此方法会同步其内部的存储器,然后递归的进行查找,直到把所有的别名找出为止。
这里有个问题,为什么synchronized的对象,是这个内部的存储器呢?
经过一系列的研究,终于了解。原来,内部的存储器,是一个ConcurrentHashMap,而对这个存储器进行上锁,可以有效的防止在获取别名是,其他线程对存储器的修改。