spring架构解析(一)--IoC容器实现

来源:互联网 发布:自己设计装修画图软件 编辑:程序博客网 时间:2024/06/11 07:16
一、Spring架构简介
    Spring的设计目标:为开发者提供个一站式的轻量级应用开发框架(平台)。就像操作系统负责存储、计算、通信、外围设备等物理资源的管理一样,Spring关系的是企业应用资源的使用,比如数据持久化、事务处理、消息中间件、web应用、分布式计算等技术的抽象。
  1.Spring的层次划分
    Spring体系的核心:IoC容器和AOP模块。通过IoC容器管理POJO对象及其依赖关系,通过AOP模块以动态和非侵入的方式来增强Spring的功能。
    JavaEE各系统组件及服务:在IoC容器和AOP模块的支持下,Spring扩展了支持JavaEE开发的多个系统组件及服务,如:JDBC、ORM、Web MVC、事务处理等。
  2.Spring的模块划分
    Spring的基本组成模块有:Spring IoC、Spring AOP、Spring MVC、Spring JDBC/ORM、Spring事务处理、Spring远端调用、Spring应用。
  3.Spring的一些特性
    耦合性低:各个模块除了依赖IoC容器和AOP之外,相互之间并没有很强的耦合性;
    非侵入性:使应用程序对框架的依赖最小,在没有框架时同样可以运行;
    面向接口:Spring推动应用的设计风格向面向对象和接口编程转变。
    可选择型:Spring只提供各种技术实现,不与单独技术绑定。

二、Spring IoC容器的设计与实现
  两个容器系列:BeanFactory和ApplicationContext。
    BeanFactory:实现容器最基本的功能;
    ApplicationContext:在简单容器的基础上,增加面向框架的特性;
  1.Spring IoC容器的数据结构
    BeanDefinition:对应java对象以及对象间的依赖关系,Spring将用户在XML文件或代码中定义的Bean,解析成对应的BeanDefinition对象,并存储在HashMap中,key为Bean的name
    HashMap:多个HashMap,分别用于存储BeanDefinition和singlton Bean实例等;

  2.Spring IoC容器的设计
    A、设计路径一:从BeanFactory到HierarchicalBeanFactory,再到ConfigurableBeanFactory。
    BeanFactory:定义了容器最基本的功能,包括getBean、containsBean、getType、getAliases、IsSinglton/Prototype/TypeMatch功能;
    HierarchicalBeanFactory:增加了IoC容器的父容器管理功能,包括getParentBeanFactory方法;
    ConfigurableBeanFactory:增加了对BeanFactory的配置功能,包括配置后处理器Bean、配置Scope、注册Aliases、销毁Bean等;
    B、设计路径二:从BeanFactory到ListableBeanFactory,再到ApplicationContext,最后到我们常用的WebApplicationContext和ConfigurableApplicationContext;
    ListableBeanFactory:细化BeanFactory功能,增加getBeanNamesForType等容器实现时需要的功能;
ApplicationContext:通过继承MessageResource、ResourceLoader、ApplicationEventPublisher接口,在BeanFactory基础上增加了高级容器的功能;

  3.Spring IoC容器的实现
    DefaultListableBeanFactory是IoC容器的基本实现,包括基本IoC容器所有重要功能,其他IoC容器都是在该实现上进行功能扩展。
    A、BeanFactory的实现
    XmlBeanFactory继承DefaultListableBeanFactory类,内部聚合一个XmlBeanDefinitionReader对象,通过loadBeanDefinition(resource)方法来加载Bean的配置。
    B、ApplicationContext的实现
    AbstractApplicationContext是基本实现,内部DefaultListableBeanFactory实例作为容器基本功能,包含一个事件监听器的Set,实现了事件机制。
    继承DefaultListableBeanFactory类,扩展MessageSource接口,支持国际化的实现;继承ResourceLoader接口,支持通过不同Resource来加载配置;继承ApplicationEventPublisher接口,引入事件机制,为Bean的生命周期管理提供支持。

三、Spring IoC容器的初始化
    在使用IoC容器之前,容器会进行初始化,初始化的步骤主要有三个:定位Resource;载入BeanDefinition;注册Definition。
    以FileSystemXmlApplicationContext实现类为例,IoC容器的初始化由容器的构造函数调用refresh()方法触发,refresh()方法是由其根类AbstractApplicationContext定义的,调用其父类AbstractRefreshableApplicationContext的refreshBeanFactory方法,在方法中初始化一个DefaultListableBeanFactory对象,并调用loadDefinition方法来加载XML文件,初始化一个XmlBeanDefinitionReader对象来负责XML文件的加载;
  1.定位Resource
    XmlBeanDefinitionReader通过获取AbstractXmlApplicationContext类的方法获取配置文件的信息,调用loadBeanDefinitions方法来加载每个resource对应的xml文件;
  2.BeanDefinition的载入和解析
    BeanDefinition的载入是通过reader的loadBeanDefinitions(resource)方法完成的,该方法通过resource获取inputstream流,从流中解析出Document对象。创建DefaultBeanDefinitionDocumentReader对象,调用registerBeanDefinitions(document,XmlReaderContext)进行解析并注册。
    具体的解析是在BeanDefinitionParserDelegate中完成的,通过parseBeanDefinition(element),解析XML文件的<bean>生成对应的得到BeanDefinitionHolder对象,该对象是对BeanDefinition的包装,对Bean的属性值解析成PropertyValue对象,并添加到BeanDefinition对象中。对于property子元素的解析过程中,Array、List等各种元素的解析都有对应的方法parseArrayElement、parseListElement等。
  3.BeanDefinition在容器中的注册
    将Bean的定义解析成BeanDefinition后,还需要将BeanDefinition注册到Spring IoC容器中,容器是通过DefaultListableBeanFactory类中的ConcurrentHashMap来持有BeanDefinition的。
    DefaultListableBeanFactory实现了BeanDefinitionRegistry接口,实现了registerBeanDefinition方法,在DefaultBeanDefinitionDocumentReader的registerBeanDefinitions方法中,解析得到BeanDefinitionHolder对象后,通过调用registerBeanDefinition方法将BeanDefinition对象put到HashMap中,即完成了注册。

四、Spring IoC容器中Bean的依赖注入
    在完成BeanDefinition的解析和注册后,此时IoC容器中并没有对Bean进实例化和依赖注入,当调用容器的getBean方法时,才出发容器的实例化。
  1.调用getBean时,首先从singletonBean的HashMap中查找,如果找不到进行下一步;
  2.对容器中对应的BeanDefinition进行检查,如果该BeanDefinition是singleton或者prototype,并调用createBean方法来创建Bean对象;根据BeanDefinition中定义的Bean的生成方式来创建Bean对象,方式包括:使用容器autowire特性、使用工厂方法、使用反射机制;
  3.创建得到Bean对象后,调用populateBean方法进行依赖注入;在该方法中,先获取该Bean对应的BeanDefinition的property值,然后依次进行属性注入,处理autowire的注入、通过反射调用set方法进行属性的注入。
  4.然后调用initializeBean方法进行Bean的初始化。在初始化过程中,会判断是否实现InitializingBean接口或指定initMethod,来调用对应的方法;是否实现Aware接口,和Bean的后处理器功能。

五、容器其他功能实现
  1.预实例化
    对于指定lazy-init属性为false的Bean,在调用DefaultListableBeanFactory容器实现类的refresh方法时,通过调用preInstantiateSingletons方法进行预初始化,预初始化的实现是通过调用getBean方法来完成的。
  2.FactoryBean的实现
    在调用getBean获取Bean实例的过程中,会判断该Bean是否实现FactoryBean接口,如果实现了则调用该Bean的getObject方法来获取产品实例并返回。
  3.BeanPostProcessor的实现
    BeanPostProcessor接口包括两个方法:postProcessBeforeInitialization和postProcessAfterInitialization,分别在Bean初始化前和初始化后执行。
    在Bean完成依赖注入后,调用initializeBean方法时,会遍历容器中的后处理器,依次进行对该Bean的增强处理。
  4.autowire的实现
    对Bean的autowire的属性处理是populateBean的一部分,通过反射得到需要注入的属性名,根据BeanDefinition中定义的注入的方式来选择autowireByName或autowireByType来进行自动注入。
    
    





c
阅读全文
0 0
原创粉丝点击