Spring的容器是如何运作的?首先看spring的容器类的结构图:
上图是spring容器的全部基础实现类,我们熟知的XmlBeanFactory和DefaultListableBeanFactory是最下层完善的基础实现类。
最上面的SimpleAliasRegistry类实现了实体类的别名注册功能,它位于core包下,我们知道core包是Spring的工具包,所以这也算是一个公共功能。
看一下方法就是很简单的别名注册,集合是ConcurrentHashMap,这里应该是考虑到同步问题。
上面是DefaultSingletonBeanRegistry,方法和属性比较多,但是看其方法和属性的访问修饰符,可以看出这个类也是一个比较单纯的增加单例Bean的功能类,
上面这个方法和之前讲到的解决循环依赖有关系,其实就是对每个注册的bean的一个状态注册,在解决循环依赖的时候会用到,至于其他地方会不会用的,目前我还不清楚。从上面的类属性图中可以看出就是一个单例bean的添加工具类,传进去工厂进行加单例和对单例在工厂类的一些判断,因为其属于对Bean的操作,所以放在了Bean包下而且还是专门的Support目录下。
上面这个类就比较nb了,也是在Support包下,我们调用getBean的时候就是使用的这个类提供的方法。可以注意到它有一个ConcurrentHashMap,
看上面的注释我们可以清除的知道,他是干什么的了,再结合方法,这个类是干什么的简直是呼之欲出。
上面这个类属性和方法比较多,直接看容易晕,可以先看其实现的接口,抽象类和类注释,先看接口和抽象类,有两个分别是ConfigurableBeanFactory和FactoryBeanRegistrySupport,说明了这个抽象类想做两件事,第一实现ConfigurableBeanFactory接口的部分或全部基础公共功能,结合大厂的尿性,接口越多单个功能就越简单,辨识度就越高,坑定是部分功能,不考究了;
第二个功能继承FactoryBeanRegistrySupport公共抽象类,这个抽象类是做什么的?了解过beanfactory和factorybean以及objectfactory的区别的朋友就会知道,这个类的功能提供对FactoryBean的支持。简单举两个方法:
是不是很清晰?然后再看类的注释:
简简单单的三句话是不是又很清晰?如果不清晰请拨打120电话,有专人解答。
上面这个类也属于超类,属性和方法比较多,直接看接口和注释。实现了AutowireCapableBeanFactory接口,字面意思就是我是宇宙无敌的BeanFactory自动装配功能,注释就是实现的接口要做的事情。注意with单词,后面跟的是使用的内容。
DefaultListableBeanFactory已经到基础实现类的上层类了,先看第一行注释:
这是一个可配置的以及可列表的bean工厂和bean属性注册接口的实现类。一个完善的基于bean元数据的beanFactory,而且可以通过后置处理器来扩展,post-processors这个很重要:
什么是bean post processor?bean生命周期始于加载bean的定义。通过拿到的这个定义,Spring可以构造出( 你不能为给定的bean类型明确指定一个bean后置处理器。每个定义的后处理器可以应用于 |
上面是https://blog.csdn.net/xvhongliang/article/details/100031340 这篇博客中关于bean post processor的解析的一部分内容,很清晰。
然后是第二段注释:
看中间的一句:通过bean的名字在一个本地表中查找是一个成本极低的操作。这句话就是这个类自己的主要功能实现。
上面这两个注释一个是提示一个是举例,就不讲了。
XmlBeanFactory就简单的多了:
实现了一个自定的xmlreader,然后将bean定义信息读取出来存入bean元数据中。另外这个类是被反对的,具体的原因可以参考:https://blog.csdn.net/dachengzi159/article/details/81273391 讲的言简意赅。
ok以上就是Spring容器的一个非常简略的介绍,但是可以让自己对Spring容器有一个大致的了解,后续的学习会更加清晰一些。