前几篇:后端
Spring核心技术原理-(1)-经过Web开发演进过程了解一下为何要有Spring?缓存
Spring核心技术原理-(2)-经过Web开发演进过程了解一下为何要有Spring AOP?微信
Spring核心技术原理-(3)-Spring历史版本变迁和现在的生态帝国网络
前三篇已经从历史的角度和你们一块儿探讨了为何会有Spring,Spring的两个核心概念:IoC和AOP的雏形,Spring的历史变迁和现在的生态帝国。本节的主要目的就是经过一个切入点带你们一块儿学习一下Spring IoC的核心原理,正如从历史的角度出发讲述为何会有Spring同样,但愿经过这个切入点能让你轻松的掌握住Spring IoC的核心原理。数据结构
本篇文章假设你已经能够熟练的使用Spring了,所以对于某一个细节如何实现的不会在进行详细的阐述!多线程
IoC(控制反转,英文含义:Inverse of Control)是Spring容器的内核,AOP、事务等功能都是创建在此基础上的。从字面意思上能够把IoC拆分为两层含义:控制和反转。控制能够理解为是接口实现类的选择权,反转能够理解为这个选择权交给第三方进行管理;总的来讲就是某一接口具体实现类的选择控制权从调用类中移除,转交给第三方进行决定,即由Spring容器经过Bean配置来进行控制,这样的话应用程序自己就不用负责依赖对象的建立和维护,而由Spring容器进行管理。架构
尽管咱们如今对IoC的基本概念都已经熟读与心了,可是在老一辈的时候,IoC的概念还不是很容易被人理解。在那个年代,业界的一位大佬,软件界泰斗级的人物Martin Fowler提出了DI(Dependency Injection,依赖注入)的概念,来代替IoC。框架
依赖注入的概念和控制反转的概念从本质上是同样的,只是从不一样的侧面描述了这个功能。依赖注入的概念描述的是让调用类对某一接口实现类的依赖关系有第三方容器或其余东西注入,以此来移除对某一接口实现类的依赖。分布式
时至今日,咱们常说的IoC/DI的时候也是把依赖注入和控制反转做为同一个概念来进行阐述的!微服务
我曾尝试过不少次,想踏进Spring原理的大门,可是一次次都被毫无头绪的开端而打退!后来逐渐翻阅一些书籍逐渐造成了那么一点点思路,接下来主要按着个人思路探讨一下Ioc容器的基本原理。
正如咱们学习骑自行车同样,开始的时候都是先看别人如何骑的,而后本身才能慢慢的学会(固然发明自行车的人是天才)。学习Spring原理也是同样,只有掌握了基本的Spring的使用,才有可能踏进Spring原理的大门。所以,这里咱们从如何使用开始哪?
一、首先看一下项目结构
继承关系:
bean的配置:
Main代码以下:
二、相信每个学习Spring的小伙伴都是从上述的方式学起的,上图中最显眼的两个类就是红色圈圈出的,也设置咱们在最开始使用到的,使用UML工具显示最基本的类图关系:
庞大的一个继承和实现体系!看到这里大体上也就是我要说的第二条路线了(下文会详细介绍)!这条路线向咱们展现了从Spring最接近用开发人员使用的ClassPathXmlApplicationContext
、FileSystemXmlApplicationContext
类到Spring的顶层接口之间层层的继承和实现关系。
看到这里咱们彷佛仍是毫无头绪,这就须要咱们借鉴前人的经验了,这个经验就是如何正确的理解BeanFactory
和ApplicationContext
之间的关系。
咱们都知道Spring是经过配置文件、注解、Java类等方式描述Bean与Bean之间的依赖关系,利用Java的反射功能实例化Bean并创建Bean与Bean之间的依赖关系;
这些底层的工做正是由Spring IoC容器完成的,除此以外Spring IoC容器还提供了Bean实例缓存、生命周期管理、时间发布等高级服务。
而这里要说的BeanFactory
和ApplicationContext
都做为Spring IoC容器的形态存在,只不过有些许区别而已,简单的来讲:(1)BeanFactory接口的实现类是一个简单容器系列,该系列的容器只实现了容器最基本的功能;(2)ApplicationContext接口的实现类是一个高级容器系列,该系列的容器在简单容器的基础上增长了不少面向框架的特性,对应用环境作了不少适配,同时添加了不少面向应用的功能,例如:国际化支持和框架事件体系结构等。
一般状况下,咱们习惯称BeanFactory为Ioc容器,而称ApplicationContext为应用上下文,有时候咱们还直接称ApplicationContext为Spring容器。
至此,我应该能够引出我要说的前两条路线:第一条路线是基于BeanFactory的简单容器系列;次日路线是基于ApplicationContext的高级容器系列;
既然BeanFactory的实现类也是一个容器,那么咱们就应该可使用它来注入咱们的Bean和获取咱们的Bean,如何使用哪?请看代码:
(1)建立IoC配置文件的抽象资源,这个抽象资源包含了BeanDefinition的定义信息(也就是咱们在bean.xml文件中配置的一个bean的数据结构); (2)建立一个BeanFactory,这里使用的是DefaultListableBeanFactory; (3)建立一个载入BeanDefinition的读取器,这里使用的是XmlBeanDefinitionReader来载入XML形式的BeanDefinition,经过一个回调配置给BeanFactory; (4)从定义好的资源位置读入配置信息,具体的解析过程由XmlBeanDefinitionReader来完成。
上述的过程,完成了整个载入和注册Bean的定义以后,咱们所须要的IoC容器就创建起来了,这个时候咱们就能够直接使用IoC容器了。
上述代码中使用了DefaultListableBeanFactory
这个BeanFactory默认实现的容器完成了Bean的注入和获取操做,查看其继承和实现关系以下:
BeanFactory
位于接口类结构的顶端,它主要定义了IoC容器中应该具备的基本特性,主要接口定义以下,根据名称就能够看出是什么做用,这里再也不一一解释:
面对如此多的接口或类,咱们应该如何理解哪?举个栗子,就像一辆汽车同样,BeanFactory中定义了这辆汽车应该具备的基本功能,经过层层的接口继承和实现为这个基本的汽车架构定制了不少特性,好比:能够座几我的,是否能够倒车等,一直到最后才造成了一辆基本能够正常使用的汽车,但到这一步仍是一个比较粗糙的产品或者半成品。(可使用,但对于普通用户不会直接使用)
而关于这些接口或类的介绍,因为篇幅有限,这里再也不一一介绍,主要给你们提供一种思路,如何顺藤摸瓜,掌握第一条理解Spring IoC容器的路线。
总的来讲,BeanFactory是Spring框架的基础设置,面向的是Spring自己,下文中讲述的第二条路线其中也是使用到了上述代码中的过程,咱们在实际的开发中不多会直接使用基于BeanFactory的简单容器系列。
相对于第一条路线中的汽车半成品来讲,第二个路线下的产品才真正算是一辆能够开的出去的汽车,在基于ApplicationContext的高级容器系列下为汽车新增了不少特性,好比:加了电子档位、加了倒车雷达、全景天窗、全液晶显示器什么的,一直到最后才造成了一辆可使用的汽车(可使用,普通用户也能够直接使用)。
从上图中能够看出来,相对于BeanFactory来讲ApplicationContext增长了不少新特性,例如MessageSource接口、ApplicationEventPublisher接口等,因此说ApplicationContext是一个高级形态意义上的IoC容器。
ApplicationContext的主要实现类是ClassPathXmlApplicationContext
、FileSystemXmlApplicationContext
,前者是经过从类路径加载配置文件,后者模式从文件系统中装载配置。
从上边的介绍咱们应该已经看出来了,不论是第一条路线仍是第二条路线都是基于Java应用的,而咱们使用最多的是JavaWeb应用,这也是接下来要说的第三条路线:基于WebApplicationContext的Web容器系列。
WebApplicationContext是专门为Web应用准备的,因为Web应用比通常的Java应用拥有更多的特性,所以WebApplicationContext扩展了ApplicationContext。
咱们在配置Spring集成Spring MVC的时候基本都会使用上述的方式配置Spring容器,ContextLoaderListener经过Web容器上下文参数contextConfigLocation
获取Spring配置文件的位置。若是只是使用Xml配置的Bean的话,会使用WebApplicationContext的实现类XmlWebApplicationContext。
本文的目的并非详细的阐述Spring IoC容器的核心原理,这是由于市面上已经有不少书讲述Spring IoC容器的核心原理的,而且简单的一篇文章很难说清楚这么多的内容,这里主要是是但愿经过将Spring IoC容器的核心原理内容进行划分,整理为3条基本路线,这样的话逐步击破,才能使本身不会被庞大的代码结构体系所吓到!
纸上得来终觉浅,绝知此事要躬行!
对于Spring IoC容器的核心原理远不止这些,可是基本都是在这三条主线上进行穿插,其余没有提到的如:容器初始化,配置文件解析过程、Bean的解析和注册等,但愿你们在在进行学习的时候注意到!
若是想进一步学习Spring原理的,这里推荐两本书籍《Spring技术内幕-深刻解析Spring架构与设计原理》和《精通Spring 4.x 企业应用开发实战》,前者可能有点久,版本不是最新的,可是书中Spring IoC容器和AOP的讲解仍是颇有参考价值的,后者应该算是市面上一本讲解还算透彻的书籍,值得阅读!