欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring中的IOC_源码_随笔

程序员文章站 2023-02-18 19:13:00
Spring ioc 叫控制反转,也就是把创建Bean的动作交给Spring去完成。 spring ioc 流程大致为 定位-> 加载->注册 先说几个比较有意思的点 1.Spring中的通过IOC生成的Bean是存放在ConcurrentHashMap中的 2.通过xml配置SpringBean时 ......

spring ioc 叫控制反转,也就是把创建bean的动作交给spring去完成。

spring ioc  流程大致为 定位-> 加载->注册

先说几个比较有意思的点

1.spring中的通过ioc生成的bean是存放在concurrenthashmap中的

Spring中的IOC_源码_随笔

 

2.通过xml配置springbean时,spring会通过dom解析的方式解析xml

Spring中的IOC_源码_随笔

3.ioc中使用了大量的委派模式,导致源码。。。阅读极其困难。

4.beanfactory和factorybean

  beanfactory是指ioc容器编程抽象,比如applicationcontext,xmlbeanfactory等,都是ioc容器的具体表现,需要使用什么样的容器由客户决定。bean工厂,是一个工厂,spring ioc的最顶层接口就是这个beanfactory,它的作用是管理bean,即实例化,定位,配置应用程序中的对象及建立这些对象间的依赖。

  factorybean只是一个可以在ioc容器中被管理的一个bean,是对各种处理过程和资源使用的抽象,factorybean在需要时产生另一个对象,而不返回自身,可以看作为一个抽象工厂。工厂bean,是一个bean,作用是产生其他bean实例。通常情况下,bean无须自己实现工厂模式,spring容器担任工厂角色,但少数情况下,容器中的bean本身就是工厂,其他工厂是产生其他bean实例。

  

 

5.最终生产的bean存在在factorybeanregistrysupport.java中,是一个concurrenthashmap

 

Spring中的IOC_源码_随笔

 

 使用put方法存入

Spring中的IOC_源码_随笔

 

他的key是 beanname + "#"+ 使用次数 

 

Spring中的IOC_源码_随笔

 

 

 

下面说下ioc的基本步骤

1.初始化的入口在容器的实现中通过refresh()来实现

2.加载bean进入ioc容器使用的是loadbeandefinition

  大致过程如下:

  2.1 resourceloader进行资源定位(默认defaultresourceloader),同时上下文本身给出了resourceloader的实现,可以从类路径,文件系统,url等方式定位资源。

  2.2 比如是使用xmlbeanfacotry作为ioc容器,需要为它指定bean定义的资源,也就是bean定义文件时通过抽象成resource来被ioc处理,容器通过beandefinitionreader来定义信息的解析和bean信息的注册,通常使用xmlbeandefinitionreader来解析bean的xml定义文件--委派给beandefinitionparserdelegate来实际处理从而得到bean的定义信息

  2.3使用loadbeandefinition,registerbeandefinition这些方法来处理beandefinition服务,容器解析得到beandefinitionioc以后,需要把它在ioc容器中注册,这是由ioc实现beandefinitregistry实现的。注册过程就是ioc容器内部维护一个hashmap来保存得到的beandefinition。

3.我们通过beanfactory和applicationcontex来享受ioc服务。

 

 

 

下面我们来打开一份spring源码,来看看继承关系

classpathxmlapplicationcontext- abstractxmlapplicationcontext - abstractrefreshableconfigapplicationcontext  - abstractrefreshableapplicationcontext - abstractapplicationcontext - defaultresourceloader / configurableapplicationcontext - applicationcontext - listablebeanfactory / hierarchicalbeanfactory -beanfactory (最上层)