一、BeanDefinition

  BeanDefinition是配置文件<bean>元素标签在容器中内部表示形式。创建最终的BeanDefinition主要包括两个步骤:
    1)利用BeanDefinitionReader对配置信息Resource进行读取,通过XML解析器解析配置信息的DOM对象,简单地为每个<bean>生成对应的BeanDefinition对象。但是这里生成的BeanDefinition可能是半成品,因为在配置文件中,我们可能通过占位符变量引用外部属性文件的属性,这些占位符变量在这一步还没有被解析出来。
    2)利用容器中注册的BeanFactoryPostProcessor对半成品的BeanDefinition进行加工处理,将以占位符表示的配置解析为最终的实际值,这样半成品的BeanDefinition就为成品的。

二、FactoryBean和BeanFactory

  一个是Factory,也就是IoC容器或对象工厂;一个是Bean。在Spring中,所有Bean都是由BeanFactory(也就是IoC容器)来进行管理的。但对FactoryBean而言,这个Bean不是简单的Bean,而是一个能产生或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似。BeanFactory接口设计了getBean方法,这个方法是使用IoC容器API的主要方法,Bean的取得是通过指定名字来进行索引的。

  BeanFactory继承体系:http://mydream1987.iteye.com/blog/1151380

  AutowireCapableBeanFactory→AbstractAutowireCapableBeanFactory→DefaultListableBeanFactory→XmlBeanFactory IoC容器的实现系列。XmlBeanFactory这个IoC容器可以读取以XML形式定义的BeanDefinition。

@Deprecated
public class XmlBeanFactory extends DefaultListableBeanFactory { private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this); /**
* Create a new XmlBeanFactory with the given resource,
* which must be parsable using DOM.
* @param resource XML resource to load bean definitions from
* @throws BeansException in case of loading or parsing errors
*/
public XmlBeanFactory(Resource resource) throws BeansException {
this(resource, null);
} /**
* Create a new XmlBeanFactory with the given input stream,
* which must be parsable using DOM.
* @param resource XML resource to load bean definitions from
* @param parentBeanFactory parent bean factory
* @throws BeansException in case of loading or parsing errors
*/
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
super(parentBeanFactory);
this.reader.loadBeanDefinitions(resource);
} }

  编程式使用IOC容器:

ClassPathResource res = new ClassPathResource("beans.xml");

DefaultListableBeanFactory factory = new DefaultListableBeanFactory();

XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);

reader.loadBeanDefinitions(res);

三、IOC容器初始化

  IoC容器的初始化包括BeanDefinition的Resouce定位、载入和注册这三个基本的过程。Spring容器的初始化主要分为三个步骤,分别使Bean信息的定位,解析与注册。以XML文件形式的Bean信息为例,Spring首先找到XML文 件的位置,然后读取此文件,并且将文件解析成相应的BeanDefinition,最后将获取到的BeanDefinition注册到BeanFactory中去。

从这副顺序图中我们可以看出,Spring容器的初始化过程主要由四个类来完成,我们可以参考下类的注释以了解这几个类的职责:

  1. XmlBeanDefinitionReader:用于XML Bean定义信息的BeanDefinitionReader,将事实上的XML文件读取代理给BeanDefinitionDocumentReader接口的一个实现。
  2. BeanDefinitionDocumentReader:用于解析Spring Bean定义信息的服务提供接口(SPI),在实际解析DOM文档的时候,由XmlBeanDefinitionReader来调用。
  3. BeanDefinitionParserDelegate:用于解析XML Bean定义信息的有状态代理类。负责一个Bean的定义信息解析策划能够BeanDefinition对象。
  4. BeanDefinitionRegistry:负责将得到的Bean定义信息注册到BeanFactory中。

四、Spring IOC实现

我们需要从总体概念上对spring IOC有一个全局认识:

五、总述

  IOC-Inversion of Control,中文意为控制反转,将bean之内相互耦合的依赖关系交给框架来处理,bean的内部不需要再维护其所依赖bean的生命周期而更加关注自身的业务逻辑。spring IOC作为IOC的一种实现,不仅管理了各个bean的生命周期和依赖关系,还提供了丰富的扩展接口去动态的修改bean的行为。

  bean的生命周期:从bean的创建、初始化、使用再到最终被销毁,整个过程中bean对象由框架来统一管理(除了prototype的bean在创建初始化后脱离了容器管理,由应用使用方自己来负责bean的销毁回收)。

  bean的作用域:按照bean的作用范围,bean的作用域分为以下5种:singleton、prototype、request、session、global session。

  singleton为单例bean的作用域,在容器中被创建后仅维持一份bean对象,创建后被缓存,任何请求该bean对象都是在这一个bean上进行操作,所以要注意线程安全问题,防止并发带来的数据修改不一致问题。比如DAO层的某个bean会被多个service使用,这些bean可以由同一个对象来代替,因为bean的数据源和行为都是一致的。

  prototype为原型bean的作用域,在任何被注入和容器中执行beanFactory.getBean()的时候,容器都会为此类bean创建一个全新的对象供其他对象使用。由于不同对象中的bean是完全不同的实例,所以它们之间互不影响,但是这样一来系统开销会比较大。

  在spring 2.0之前仅有单例和非单例两种类型的bean作用域,到了2.0之后引入了request、http session和global session这三种作用域。

  request是针对web应用的http请求级别的bean作用域。HttpRequest就是一个很好的例子,request请求中包含用户每次请求中的数据,每一次请求中传输的数据是不同的。

  http session是指bean生命周期贯穿一次完整的http会话过程。只要客户端和web服务器之间的会话没有断开,session级别的bean对象就不会被销毁。具体例子如HttpSession对象,不同的session容器会为其创建不同的session对象。

六、

spring源码:IOC(li)的更多相关文章

  1. Spring源码——IOC控制反转

    1.基础知识 Spring有两个核心功能,分别是ioc和aop,其中ioc是控制反转,aop是切面编程. 在ioc中,还有一个名次叫DI,也就是依赖注入.嗯,好像IOC和DI是指同一个,好像又感觉他俩 ...

  2. Spring源码-IOC部分-Spring是如何解决Bean循环依赖的【6】

    实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...

  3. Spring源码-IOC部分-容器简介【1】

    实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...

  4. Spring源码-IOC部分-容器初始化过程【2】

    实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...

  5. Spring源码-IOC部分-Xml Bean解析注册过程【3】

    实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...

  6. Spring源码-IOC部分-自定义IOC容器及Bean解析注册【4】

    实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...

  7. Spring源码-IOC部分-Bean实例化过程【5】

    实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...

  8. Spring源码-IOC部分-循环依赖-用实例证明去掉二级缓存会出现什么问题【7】

    实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...

  9. 零基础带你看Spring源码——IOC控制反转

    本章开始来学习下Spring的源码,看看Spring框架最核心.最常用的功能是怎么实现的. 网上介绍Spring,说源码的文章,大多数都是生搬硬推,都是直接看来的观点换个描述就放出来.这并不能说有问题 ...

  10. spring源码-ioc容器周期

    Spring容器的refresh 创建刷新:   1-prepareRefresh刷新前的预处理: initPropertySources 初始化一些属性配置,原来是空的,子类自定义的属性设置方法 g ...

随机推荐

  1. Java获取本机的IP与MAC地址

    有些机器有许多虚拟的网卡,获取IP地址时会出现一些意外,所以需要一些验证: // 获取mac地址 public static String getMacAddress() { try { Enumer ...

  2. IT持续集成之质量管理

    研发工具生态 质量相关工作 一次编译产出测试包与上线包 !从源头保证版本的⼀一致性!代码质量控制! 全⽅方位的⾃自动化测试体系保证! 提测冒烟效率! 全⾃自动上线流程杜绝⼈人⼯工犯错! 生产环境应⽤用 ...

  3. 手把手教你做个人 app

    我们都知道,开发一个app很大程度依赖服务端:服务端提供接口数据,然后我们展示:另外,开发一个app,还需要美工协助切图.没了接口,没了美工,app似乎只能做成单机版或工具类app,真的是这样的吗?先 ...

  4. MySQL常用命令

    数据库登陆命令: mysql -uroot -p 2.提示输入密码: 3.登陆成功: 4.数据库修改相关命令: 修改数据库的编码格式: 语法格式为:ALTER {DATABASE|SCHEMA}  [ ...

  5. 项目游戏开发日记 No.0x00000

    14软二杨近星(2014551622) ---恢复内容开始--- 2016-03-17 从开始迈进软件工程专业, 已经快两年了, 记得当初选择软件的理由是, 我要学去做东西, 我享受开发过程. 两年来 ...

  6. SSD框架训练自己的数据集

    SSD demo中详细介绍了如何在VOC数据集上使用SSD进行物体检测的训练和验证.本文介绍如何使用SSD实现对自己数据集的训练和验证过程,内容包括: 1 数据集的标注2 数据集的转换3 使用SSD如 ...

  7. 按照Enterprise Integration Pattern搭建服务系统

    在前一篇文章中,我们已经对Enterprise Integration Pattern中所包含的各个组成进行了简单地介绍.限于篇幅(20页Word以内),我并没有深入地讨论各个组成.但是如果要真正地按 ...

  8. 最近做了了解java基础的一些题,整理自己用到的一些函数和了解的一些名词

    [程序1]题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析: 兔子的规律为数列1,1,2, ...

  9. php 查询

    <h1>租房信息</h1> <?php $db = ","asdadads"); $tj = "1=1"; $tj1 = ...

  10. python __getitem__, __setitem__ 实现属性的索引式存取

    class MyDictionary(object): """docstring for MyDictionary""" kv = {} d ...