现在的位置: 首页 > 操作系统 > 正文

Spring:源码解读SpringIOC原理

2020年02月13日 操作系统 ⁄ 共 3008字 ⁄ 字号 评论关闭

SpringIOC设计原理解析:本文乃学习整理参考而来

一、什么是Ioc/DI?

二、SpringIOC体系结构

(1)BeanFactory

(2)BeanDefinition

三、IoC容器的初始化

1、XmlBeanFactory(屌丝IOC)的整个流程

2、FileSystemXmlApplicationContext的IOC容器流程

1、高富帅IOC解剖

2、设置资源加载器和资源定位

3、AbstractApplicationContext的refresh函数载入Bean定义过程:

4、AbstractApplicationContext子类的refreshBeanFactory()方法:

5、AbstractRefreshableApplicationContext子类的loadBeanDefinitions方法:

6、AbstractBeanDefinitionReader读取Bean定义资源:

7、资源加载器获取要读入的资源:

8、XmlBeanDefinitionReader加载Bean定义资源:

9、DocumentLoader将Bean定义资源转换为Document对象:

10、XmlBeanDefinitionReader解析载入的Bean定义资源文件:

11、DefaultBeanDefinitionDocumentReader对Bean定义的Document对象解析:

12、BeanDefinitionParserDelegate解析Bean定义资源文件中的<Bean>元素:

13、BeanDefinitionParserDelegate解析<property>元素:

14、解析<property>元素的子元素:

15、解析<list>子元素:

16、解析过后的BeanDefinition在IoC容器中的注册:

17、DefaultListableBeanFactory向IoC容器注册解析后的BeanDefinition:

总结:

四、IOC容器的依赖注入

1、依赖注入发生的时间

2、AbstractBeanFactory通过getBean向IoC容器获取被管理的Bean:

3、AbstractAutowireCapableBeanFactory创建Bean实例对象:

4、createBeanInstance方法创建Bean的java实例对象:

5、SimpleInstantiationStrategy类使用默认的无参构造方法创建Bean实例化对象:

6、populateBean方法对Bean属性的依赖注入:

7、BeanDefinitionValueResolver解析属性值:

8、BeanWrapperImpl对Bean属性的依赖注入:

五、IoC容器的高级特性

1、介绍

2、SpringIoC容器的lazy-init属性实现预实例化:

(1).refresh()

(2).finishBeanFactoryInitialization处理预实例化Bean:

(3).DefaultListableBeanFactory对配置lazy-init属性单态Bean的预实例化:

3、FactoryBean的实现:

(1).FactoryBean的源码如下:

(2).AbstractBeanFactory的getBean方法调用FactoryBean:

(3)、AbstractBeanFactory生产Bean实例对象:

(4).工厂Bean的实现类getObject方法创建Bean实例对象:

4.BeanPostProcessor后置处理器的实现:

(1).BeanPostProcessor的源码如下:

(2).AbstractAutowireCapableBeanFactory类对容器生成的Bean添加后置处理器:

(3).initializeBean方法为容器产生的Bean实例对象添加BeanPostProcessor后置处理器:

(4).AdvisorAdapterRegistrationManager在Bean对象初始化后注册通知适配器:

5.SpringIoC容器autowiring实现原理:

(1).AbstractAutoWireCapableBeanFactory对Bean实例进行属性依赖注入:

(2).SpringIoC容器根据Bean名称或者类型进行autowiring自动依赖注入:

(3).DefaultSingletonBeanRegistry的registerDependentBean方法对属性注入:

IoC容器:最主要是完成了完成对象的创建和依赖的管理注入等等。

先从我们自己设计这样一个视角来考虑:

所谓控制反转,就是把原先我们代码里面需要实现的对象创建、依赖的代码,反转给容器来帮忙实现。那么必然的我们需要创建一个容器,同时需要一种描述来让容器知道需要创建的对象与对象的关系。这个描述最具体表现就是我们可配置的文件。

对象和对象关系怎么表示?

可以用xml,properties文件等语义化配置文件表示。

描述对象关系的文件存放在哪里?

可能是classpath,filesystem,或者是URL网络资源,servletContext等。

回到正题,有了配置文件,还需要对配置文件解析。

不同的配置文件对对象的描述不一样,如标准的,自定义声明式的,如何统一?在内部需要有一个统一的关于对象的定义,所有外部的描述都必须转化成统一的描述定义。

如何对不同的配置文件进行解析?需要对不同的配置文件语法,采用不同的解析器

(1)BeanFactory

SpringBean的创建是典型的工厂模式,这一系列的Bean工厂,也即IOC容器为开发者管理对象间的依赖关系提供了很多便利和基础服务,在Spring中有许多的IOC容器的实现供用户选择和使用,其相互关系如下:

其中BeanFactory作为最顶层的一个接口类,它定义了IOC容器的基本功能规范,BeanFactory有三个子类:ListableBeanFactory、HierarchicalBeanFactory和AutowireCapableBeanFactory。但是从上图中我们可以发现最终的默认实现类是DefaultListableBeanFactory,他实现了所有的接口。那为何要定义这么多层次的接口呢?查阅这些接口的源码和说明发现,每个接口都有他使用的场合,它主要是为了区分在Spring内部在操作过程中对象的传递和转化过程中,对对象的数据访问所做的限制。例如ListableBeanFactory接口表示这些Bean是可列表的,而HierarchicalBeanFactory表示的是这些Bean是有继承关系的,也就是每个Bean有可能有父Bean。AutowireCapableBeanFactory接口定义Bean的自动装配规则。这四个接口共同定义了Bean的集合、Bean之间的关系、以及Bean行为.

最基本的IOC容器接口BeanFactory

以上就上有关Spring:源码解读SpringIOC原理的相关介绍,要了解更多Spring IOC,Spring IOC源码,Spring:源码解读Spring IOC原理,编程,Linux编程,Linux Shell,Android,Android教程,JAVA,C语言,Python,HTML5内容请登录学步园。

抱歉!评论已关闭.