Spring IOC源码解读,重点围绕以下几部分去探究Spring IOC源码的秘密,分别是:
- Spring Ioc 容器是什么?作用有哪些?整体架构是如何组成的?整个体系结构由哪些核心类组成?
- Spring Ioc 容器内的两条设计主线,BeanFactory设计主线,ApplicationContext设计主线,以及它们的设计原理和对应的应用场景,还有彼此之间的区别。
- IOC容器的初始化过程,整体过程比较复杂,大的方面涉及三大部分。(定位Resource,BeanDefinition载入,注册BeanDefinition),这里面涉及到的细节非常多,需要仔细一一阅读。
- 基于Spring Ioc容器初始化过程拓展点的研究。
- Spring Ioc容器初始化过程拓展点实例应用。
- IOC容器对bean的初始化过程。
浅谈IOC
IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”,或者叫做“依赖反转”,看一下维基百科中对此的定义:
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递(注入)给它。
早在2004年,Martin Fowler就提出了“哪些方面的控制被反转了?”这个问题。他总结出是依赖对象的获得被反转了,因为大多数应用程序都是由两个或是更多的类通过彼此的合作来实现业务逻辑,这使得每个对象都需要获取与其合作的对象(也就是它所依赖的对象)的引用。如果这个获取过程要靠自身实现,那么这将导致代码高度耦合并且难以维护和调试。
该原则规定:
- 高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象接口。
- 抽象接口不应该依赖于具体实现。而具体实现则应该依赖于抽象接口。
Spring Ioc容器作用
- 创建对象,维护对象生命周期。
- 管理对象间复杂的依赖关系。
整体架构组成
Spring Core模块,包括:
- spring-core
- spring-beans
- spring-context
- spring-context-support
- spring-expression
核心类组成
Spring IoC容器内,有两个主要的容器设计,一个是BeanFactory接口的简单容器对象,这个系列容器只实现了容器最基本的功能,另外一个是ApplicationContext应用上下文。这里列举下主要的类图以及核心类,混个脸熟先。
以BeanFactory为核心的主要类图结构:
核心类:DefaultListableBeanFactory
默认实现了ListableBeanFactory和BeanDefinitionRegistry接口,基于BeanDefinition对象,是一个成熟的bean Factroy。
Spring容器加载时,最常见的应用是:在访问bean前,需要注册所有的definition(可能从bean definition配置文件中)。使用预先建立的bean定义元数据对象,从本地的BeanDefinition表中查询BeanDefinition因而将不会花费太多成本。
DefaultListableBeanFactory既可以作为一个单独的beanFactory,也可以作为自定义beanFactory的父类。
其他相关类:
- AliasRegistry:定义对alias的简单增删改等操作。
- SimpleAliasRegistry:主要使用map作为alias的缓存,并对接口AliasRegistry进行实现。
- SingletonBeanRegistry:定义对单例的注册及获取。
- BeanFactory:定义获取bean及bean的各种属性。
- DefaultSingletonBeanRegistry:对接口SingletonBeanRegistry各函数的实现。
- HierarchicalBeanFactory:继承BeanFactory,也就是在BeanFactory定义的功能的基础上增加了对parentFactory的支持。
- BeanDefinitionRegistry:定义对BeanDefinition的各种增删改操作。
- FactoryBeanRegistrySupport:在DefaultSingletonBeanRegistry基础上增加了对FactoryBean的特殊处理功能。
- ConfigurableBeanFactory:提供配置Factory的各种方法。
- ListableBeanFactory:根据各种条件获取bean的配置清单。
以ApplicationContext为核心的主要类图结构:
可以看到ApplicationContext接口继承了BeanFactory系列的接口。同时比BeanFactory又多实现了几个接口,如下:
- EnvironmentCapable,和系统环境相关联的接口。
- MessageSource,支持消息国际化的接口。
- ApplicationEventPublisher,支持spring上下文发布事件的接口。
- ResourcePatternResolver,定位资源解析资源的接口,例如像xml这种在spring ioc内部都被抽象为了Resource。
小结:
- Spring ioc的依赖反转,本质上是为了解决复杂系统中,构造对象复杂的问题,管理对象周期,使其程序员可以专注于程序逻辑的开发,使其分层之间满足高内聚,低耦合的原则。
- Spring-core包是其整个Spring的底层支撑,从分包上可以清晰的表达出每个模块的职责。
- Spring ioc重点围绕BeanFactory和ApplicationContext对象展开,分两条线进行,但是其中也会有交叉,基本上ioc这块的核心类都是围绕这两个核心接口去设计的。