请选择 进入手机版 | 继续访问电脑版

热点推荐

查看: 116|回复: 2

3-AbstractBeanDefinition

[复制链接]

该用户从未签到

428

主题

428

帖子

1284

积分

金牌会员

Rank: 6Rank: 6

积分
1284
发表于 2020-2-14 19:27:29 | 显示全部楼层 |阅读模式
背景简介

出现的原因

之前我们分析了 BeanDefinition 的职责及在接口中做的基本操作。为了满足不同的具体用途,我们会定义不同的BeanDefinition的具体实现。
但是这些实现除了一些具体的属性和操作是定制的,大部分都是模版性质的代码或者说都是共同的功能,所以抽出一个基本的实现类来实现通用操作就变得有必要了。
这种模式我们在之前看集合类的那一系列操作经常看到,这些设计参考的设计模式是适配器模式/模版方法模式
区分这两种模式的一个比较明显的点是:

  • 你在Abstract***中将主干逻辑实现了,专门设置/留下一些核心方法让子类定制,这个一般是模版方法模式
  • 如果你在Abstract***中只是将通用的一些逻辑从头搞定,或者只是做了默认实现,这个一般是适配器模式
职责

AbstractBeanDefinition对BeanDefinition中规定的方法中最通用的一些操作进行了实现,方便子类将注意力专门放到自己关注的领域。
注意点

源码

类继承结构分析

思路引导

我们在读 Spring 源码时经常会遇到一个类要实现的接口是 n 多个接口继承出来的。继承树超级复杂,我们如果要对这样的接口进行一个 Abstract****的实现,涉及的东西超级多。
但是我们这样想一下:
接口进行了 n 多个的继承,接口继承的目的很明显:功能加强/融合。一般很少有接口仅仅是用来定义的,接口一般都对应自己定义的功能的默认实现。
我们直接继承那个默认实现,是不是就可以不用专门在我们的Abstract****中全都写一遍了?
这种思路有个致命的缺点:
Java 的单继承带来了很多的便利,例如从根源上避免了 C++ 的多继承引起的问题,也不会了解虚基类的那些。
但是还是会带来一些问题的,例如如果你要实现的那个接口如果它的继承数量 n >= 2 ,可能找不到合适的功能默认实现类来继承。
如果遇到这个问题,我门可以考虑慢慢继承。。。。。二合一、二合一的来。。。。有点像最开始的XmlBeanFactory的继承树那样。
实践

我们来分析一下——BeanDefinition继承了两个接口:

  • AttributeAccessor
  • BeanMetadataElement
这明显 >=2 了,我们试一下二合一、二合一的来。。。。
整合AttributeAccessor

先找其中一个的实现类,我们找 AttributeAccessor吧。这个接口是一个属性的增删改查的功能。我们找到了它的一个实现类AttributeAccessorSupport,用LinkedHashMap为内部数据结构做了一个基本实现。
整合BeanMetadataElement

这个接口定义了一个获得 bean 的源数据内容的函数。我们直接继承AttributeAccessorSupport ,然后实现BeanMetadataElement。这样就把这两个功能整到一起了。有了BeanMetadataAttributeAccessor这个类,就是内部定义了一个source的属性用来存源数据内容,剩下的AttributeAccessor的功能都依靠父类的实现。
整合进来

上面我们用BeanMetadataAttributeAccessor完成了两个功能的整合。接下来直接继承它就行了。然后把所有的注意力都放到BeanDefinition中定义的方法中来。
结果对比

唯一比较突兀的是考虑到一些复制操作,AbstractBeanDefinition实现了Clonable接口。虽然继承树看着贼鸡儿乱,但是根据上面的分析,基本就透彻了。此处不再赘述,我们直接看AbstractBeanDefinition中对BeanDefinition中定义的方法的描述。
其实这也是一个类注重一个功能,是设计模式中的单一职责原则
内部源码解析

AbstractBeanDefinition主要做了三件事:

  • 扩展了一下 BD 中定义的常量。
  • 针对 BD中定义的那一串 getter/setter方法,定义了一把子实例属性。
  • 多定义了一些属性,并定义了一些工具方法。
常量扩展
回复

使用道具 举报

该用户从未签到

0

主题

49

帖子

98

积分

注册会员

Rank: 2

积分
98
发表于 2020-3-25 11:49:32 | 显示全部楼层
楼主呀,,,您太有才了。。。
回复

使用道具 举报

该用户从未签到

10

主题

66

帖子

142

积分

注册会员

Rank: 2

积分
142
发表于 2020-8-21 20:53:11 | 显示全部楼层
无论是不是沙发都得回复下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表