Spring的BeanFactory体系结构(二) – SimpleAliasRegistry

接着之前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,而对这个存储器进行上锁,可以有效的防止在获取别名是,其他线程对存储器的修改。

相关文章

This entry was posted in Java, Spring and tagged , , , . Bookmark the permalink.

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>