一、Ioc容器的初始化:
1、Ioc容器的初始化是通过调用refesh方法来进行初始化;
2、Ioc容器的初始化可分为三个基本过程:
(1) BeanDefinition的Resource定位:
所谓的Resource定位就是找到定义bean信息的资源文件的物理位置;
(2) BeanDefinition的载入;
载入就是将定义好的Bean信息表示成Ioc容器内部的数据结构;
(3) BeanDefinition的注册;
这个过程是通过调用BeanDefinitionRegistry接口的实现来完成的,这个注册过程会把载入的Bean信息向Ioc容器注册,然后将bean信息存入一个Map中,作为Ioc容器持有Bean信息的缓存;
3、值得注意的是,在初始化中,如果对某个bean设置了lazyinit属性的话,则在初始化的过程中完成bean的载入和依赖注入;如果没有设置的话,只进行bean的载入,在第一次getBean时才会出发bean的依赖注
入过程;在Spring中bean的载入和依赖注入是两个相对独立的过程。
二、对Ioc容器初始化的三个基本过程进行分析:(以FileSystemXmlApplicationContext容器类为例)
1、通过对BeanDefinition的Resource进行定位,获取IO操作对象,具体如下描述:
(1) 利用FileSystemXmlApplicationContext的FileSystemXmlApplicationContext(String configLocation)构造器建立FileSystemXmlApplicationContext对象时会调用refresh方法;
(2) 调用refresh方法中会触发refreshBeanFactory方法(此方法在AbstractRefreshableApplicationContext类中);
(3) 调用refreshBeanFactory方法中继续触发getResourceByPath方法(此方法在FileSystemResource类中);
(4) getResourceByPath方法完成后会返回一个FileSysemResource对象,此对象就是定位完成后返回的可以进行IO操作的对象。
2、BeanDefinition的载入和解析:
在完成对BeanDefinition的Resource定位分析后,下面来了解整个BeanDefinition信息的载入过程。
(1) 利用FileSystemXmlApplicationContext的FileSystemXmlApplicationContext(String configLocation)构造器建立FileSystemXmlApplicationContext对象时会调用refresh方法;
(2) 调用refresh方法中会触发createBeanFactory方法,创建一个DefaultListableBeanFactory类型的beanFactory对象;
(3) 创建完beanFactory对象后,调用loadBeanDefinitions方法;
在loadBeanDefinitions方法中,因为之前已经初始化了一个XmlBeanDefinitionReader读取器对象,加上之前得到的代表XML文件的Resource,所以读取器可以在打开I/O流后得到XML的文件对象, 有了文件对象后,就可以按照Spring的Bean定义规则来对这个XML的文档树进行相应的解析操作。
(4) 调用paseBeanDefinitionElement方法对XML文件对下你给进行解析,并将解析后的数据保存在Ioc容器中的数据结构。(paseBeanDefinitionElement方法在BeanDefinitionParserDelegate类中)
3、BeanDefinition在IoC容器中的注册:
在完成对BeanDefinition的载入和解析后,就是将BeanDefinition的信息注册到一个HashMap中,完成BeanDefinition在IoC容器中的注册。
(1) 利用FileSystemXmlApplicationContext的FileSystemXmlApplicationContext(String configLocation)构造器建立FileSystemXmlApplicationContext对象时会调用refresh方法;
(2) 调用refresh方法中会触发createBeanFactory方法,创建一个DefaultListableBeanFactory类型的beanFactory对象;
(3) 创建完BeanFactory对象后,调用loadBeanDefinitions方法;
(4) 调用XmlBeanDefinitionReader中的processBeanDefinition方法,进入方法后会调用DefaultListableBeanFactory中的registerBeanDefinition方法,在此方法中就会把上一步解析出的数据结构封装到一个 HashMap中;(HashMap对象在DefaultListableBeanFactory类中,名称beanDefinitionMap)
分享到:
相关推荐
Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- ...
Java-Spring-SpringIoC容器-SpringIoC的学习 SpringIoC容器的学习笔记 主要介绍了IoC容器工作原理以及如何配置IoC容器 通过标签和注解配置容器
spring-IOC的一些笔记心得
Spring-IoC容器
spring-ioc学习 新手可以下过来学习下, spring-ioc简介
spring IoC, 使用配置文件方式配置Bean的实例化和依赖注入
Spring IOC 技术的必备开发包,有了这些包就可以放心研究Spring IOC 技术了
ioc容器的理解与使用
来自极客学院平台的springIoc文档
《Spring-IoC 复习笔记》博客附件。 博客地址:https://blog.csdn.net/Supreme_Sir/article/details/109165058
Spring-IOC实例
Spring-IOC的简单实现,包括注解和注解解析,欢迎大家拍砖~!
前言11第 1 章第 1 章设计用户持久化类设计用户持久化类33第 2 章第 2 章工厂模式工厂模式66第 3 章第 3 章工厂模式改进工厂模式改进88第 4
Spring IOC容器详解,是个轻量级容器
深入理解java的spring-ioc的使用.docx
spring-demo10-注解-IOC.zip
spring Ioc容器配置 IOC容器数据源配置 <!-- 配置数据源 --> destroy-method="close"> <value>org.gjt.mm.mysql.Driver <value>jdbc:mysql://localhost:3306/demo <value>root ...
Spring_IOC-v(上)笔记Spring_IOC-v(上)笔记Spring_IOC-v(上)笔记Spring_IOC-v(上)笔记
SSH笔记-IOC容器中 Bean 的生命周期,通过实现BeanPostProcessor接口,来定义初始化方法和销毁方法时的逻辑
spring ioc指的是控制反转,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。交由Spring容器统一进行管理,从而实现松耦合