作者:芬飞满天2011 | 来源:互联网 | 2023-10-10 14:59
目录
- 目录
- 前言
- 学习源码的入手一些想法
- 主要接口列举
- bean加载大体流程
- DefaultListableBeanFactory类图
- DefaultListableBeanFactory简单介绍
- 总结
前言
总想尝试着学习点spring源码,学习学习好的编程方式、编程思想等。可是实在是不知道如何下手,毕竟源码里面有那么多的Java文件,该看什么从哪里看一直困扰我。每次研究完绕了一圈,又不知道自己是从哪里开始哪里结束的,那感觉真的就像是走迷宫,走着走着不知道起点,走着走着又回到了起点。
这边文章,应该是学习笔记吧,把我的学习方法和思路记录下。
学习源码的入手一些想法
Java是个面向对象的语言,我想多多少少都接触过设计模式,应该知道设计模式的六大原则。spring这么牛逼的框架,里面的编程想法也应该大部分是符合这六大原则。六大原则中,有个是依赖倒转原则,简单内容就是“针对接口编程,依赖于抽象而不依赖于具体”,大概的意思是:我定义好了接口,知道了每个接口做什么,具体的实现我不管,每次用的时候我都依赖于我需要的接口进行调用具体我调用了哪个实现类我不用在意这么多。
所以我想,如果在看源码的时候,能够把握好spring定义的接口以及作用,就好比在迷宫中,你有了一张“地图”,在被spring的各种类间调用的不知道你在何处的时候,看看这张“地图”,可以快速的定位到你的位置,知道此刻的位置在做什么以及他的作用在何处。下面我们看看bean包中的几个比较重要的接口。
主要接口列举
- BeanFactory
定义了获取bean以及bean的各种属性
- HierarchicalBeanFactory
增加了对父类ParentBeanFactory的定义
- ConfigurableBeanFactory
定义了各种beanfactory的配置操作
- AutowireCapableBeanFactory
定义了自动注入、初始化、以及bean的后置处理
- ListableBeanFactory
根据条件获取bean的相关配置信息
- ConfigurableListableBeanFactory
beanfactory的配置清单,并且定义了忽略类型以及接口
- BeanDefinition
定义了bean的各种属性和操作
- AliasRegistry
定义了对别名(alias)的注册,删除,判断,获取
- SingletonBeanRegistry
定义了对单例的注册和获取
- BeanDefinitionRegistry
定义了对BeanDefinition的操作
- FactoryBean
定义了bean对象的获取,以及是否单例的判断
看上面的这几个接口,是不是感觉好像是把大部分spring对bean的操作配置什么的都包括,又感觉好乱…没了章法,好像知道你干嘛的又说不上来你干嘛的。接下来我们结合下bean加载的流程。
bean加载大体流程
这个流程特别的粗糙,不过bean的加载流程大致也是这样的,从获取配置文件(我们常见的xml或者注释),然后解析这个配置文件,接着是把配置内容加载到类实例中,最后把这个类实例注册到spring的容器中。这个容器其实简单的理解就是K-V。
我们把上面的流程对应的接口再抽取出来就是:
- BeanFactory 定义了获取bean以及bean的各种属性
- BeanDefinition 定义了bean的各种属性和操作
- BeanDefinitionRegistry定义了对BeanDefinition的操作
BeanFactory 暂时不用关注,因为这个是bean的获取的流程中使用。
BeanDefinition定义了bean的各种属性和操作。就是流程图中的类实例对应的那个类接口
BeanDefinitionRegistry 就是把bean加载到容器中定义的接口。
其他的接口,我想用过spring的童鞋多多少少知道他们的作用,就不多说了。
说到这,我想已经多少了解了点bean加载的过程和用到的主要的接口,那么对于这些接口的使用、结合、操作实现等等的使用,我想肯定要说的就是DefaultListableBeanFactory。我先把这个类的类图画出来。
DefaultListableBeanFactory类图
我把每个接口,类的具体作用简单的标注了下。
DefaultListableBeanFactory简单介绍
突然冒出DefaultListableBeanFactory这个类图介绍,显得有点突兀,不过仔细看一下DefaultListableBeanFactory这个类图,也许就知道为什么是用这个类图。DefaultListableBeanFactory类是spring的bean包中非常重要的一个类,通过类图其实也可以看出来,他把之前说到的几个重要的bean包中的接口,通过继承实现的方式具体实现。
所以通过DefaultListableBeanFactory就可以把bean加载到spring的容器中。这个类的具体实现过程以后有机会再说。
总结
这个是我写的第一篇的博客,内容讲的挺泛,少了点针对性。只是简单了介绍了下学习spring源码的一个思路吧。如果有时间有机会,把我自己学习的一些想法,一些觉得该记录下来的东西写写,以后复习时候更好理解和记忆。