spring的容器管理

Spring的容器是如何运作的?首先看spring的容器类的结构图:

spring的容器管理

 上图是spring容器的全部基础实现类,我们熟知的XmlBeanFactory和DefaultListableBeanFactory是最下层完善的基础实现类。

最上面的SimpleAliasRegistry类实现了实体类的别名注册功能,它位于core包下,我们知道core包是Spring的工具包,所以这也算是一个公共功能。

spring的容器管理

 看一下方法就是很简单的别名注册,集合是ConcurrentHashMap,这里应该是考虑到同步问题。

spring的容器管理

 上面是DefaultSingletonBeanRegistry,方法和属性比较多,但是看其方法和属性的访问修饰符,可以看出这个类也是一个比较单纯的增加单例Bean的功能类,

spring的容器管理

 上面这个方法和之前讲到的解决循环依赖有关系,其实就是对每个注册的bean的一个状态注册,在解决循环依赖的时候会用到,至于其他地方会不会用的,目前我还不清楚。从上面的类属性图中可以看出就是一个单例bean的添加工具类,传进去工厂进行加单例和对单例在工厂类的一些判断,因为其属于对Bean的操作,所以放在了Bean包下而且还是专门的Support目录下。

spring的容器管理

 上面这个类就比较nb了,也是在Support包下,我们调用getBean的时候就是使用的这个类提供的方法。可以注意到它有一个ConcurrentHashMap,

spring的容器管理

 看上面的注释我们可以清除的知道,他是干什么的了,再结合方法,这个类是干什么的简直是呼之欲出。

spring的容器管理

 上面这个类属性和方法比较多,直接看容易晕,可以先看其实现的接口,抽象类和类注释,先看接口和抽象类,有两个分别是ConfigurableBeanFactory和FactoryBeanRegistrySupport,说明了这个抽象类想做两件事,第一实现ConfigurableBeanFactory接口的部分或全部基础公共功能,结合大厂的尿性,接口越多单个功能就越简单,辨识度就越高,坑定是部分功能,不考究了;

第二个功能继承FactoryBeanRegistrySupport公共抽象类,这个抽象类是做什么的?了解过beanfactory和factorybean以及objectfactory的区别的朋友就会知道,这个类的功能提供对FactoryBean的支持。简单举两个方法:

spring的容器管理

 是不是很清晰?然后再看类的注释:

spring的容器管理

 简简单单的三句话是不是又很清晰?如果不清晰请拨打120电话,有专人解答。

spring的容器管理

上面这个类也属于超类,属性和方法比较多,直接看接口和注释。实现了AutowireCapableBeanFactory接口,字面意思就是我是宇宙无敌的BeanFactory自动装配功能,注释就是实现的接口要做的事情。注意with单词,后面跟的是使用的内容。

spring的容器管理

 DefaultListableBeanFactory已经到基础实现类的上层类了,先看第一行注释:

spring的容器管理

 这是一个可配置的以及可列表的bean工厂和bean属性注册接口的实现类。一个完善的基于bean元数据的beanFactory,而且可以通过后置处理器来扩展,post-processors这个很重要:

什么是bean post processor?

bean生命周期始于加载bean的定义。通过拿到的这个定义,Spring可以构造出(construct嘛)bean并注入组件(因为我们常用的就是在controller里 service里使用)。之后,所有的bean都可以进行后置处理。这意味着我们可以实现一些自定义逻辑并调用它。并在调用bean的初始化方法(xml配置所定义的init-method 属性)之前和/或之后进行调用(当然默认的上下文环境是Spring容器)。

你不能为给定的bean类型明确指定一个bean后置处理器。每个定义的后处理器可以应用于application context中的所有定义的bean。后置处理器bean必须实现org.springframework.beans.factory.config.BeanPostProcessor接口并定义postProcessBeforeInitializationpostProcessAfterInitialization方法。第一个在调用初始化方法(init-method所指定的方法)之前被调用,第二个在调用初始化方法之后被调用。这两个方法都有两个参数.

上面是https://blog.csdn.net/xvhongliang/article/details/100031340 这篇博客中关于bean post processor的解析的一部分内容,很清晰。

spring的容器管理spring的容器管理

 然后是第二段注释:

spring的容器管理

 看中间的一句:通过bean的名字在一个本地表中查找是一个成本极低的操作。这句话就是这个类自己的主要功能实现。

spring的容器管理

 上面这两个注释一个是提示一个是举例,就不讲了。

spring的容器管理

 XmlBeanFactory就简单的多了:

spring的容器管理

 实现了一个自定的xmlreader,然后将bean定义信息读取出来存入bean元数据中。另外这个类是被反对的,具体的原因可以参考:https://blog.csdn.net/dachengzi159/article/details/81273391 讲的言简意赅。

ok以上就是Spring容器的一个非常简略的介绍,但是可以让自己对Spring容器有一个大致的了解,后续的学习会更加清晰一些。

相关推荐