Spring中的IOC_源码_随笔

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

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

先说几个比较有意思的点

1.Spring中的通过IOC生成的Bean是存放在ConcurrentHashMap中的

 

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

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

 

 

 使用Put方法存入

 

他的Key是 beanName + "#"+ 使用次数 

 

 

依赖注入的流程

  1.读取BeanDefinition中信息,获取其依赖关系

  2.实例化 

 

 

 

下面说下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 (最上层)

 

补充

IOC的代理方式

  如果被代理的类实现了一个接口,那么默认使用JDK代理

  如果没有实现任何接口,那么默认使用cglib

 

posted @ 2019-03-26 21:42  wujc_sh  阅读(295)  评论(0编辑  收藏  举报