Spring框架是当今java语言领域使用最多的框架,没有之一。与它整合的其他框架也是多如牛毛。就拿mybatis来举个例子,在使用mybatis时我们只需要写个接口,增加点注解(当然也可以使用xml来配置),就可以在项目中操作数据库了,而且还不需要我们自己去开启和关闭事务,对于这些难道大家就没有疑问,系统是如何做到这点的?
疑问我想是有的,但是要解释这些问题就不怎么好搞定了,如果你不懂Spring框架的底层原理,你根本不可能清楚Spring是如何实现上述能力的,当然也就更不可能基于Spring灵活的进行扩展。但是一旦你掌握了Spring框架的核心原理,除了能够轻松弄清楚上述原理,对于很多新的与Spring整合的框架原理,我敢保证你都能游刃有余的进行分析。所以从这篇文章开始,笔者就将来扒一扒Spring的神秘面纱。
我们知道Spring是对Bean进行管理的一个容器,如图显示了Spring的大概处理过程,后续笔者也将基于这个整体的处理流程来进行逐一分析:
1、Spring如何定义Bean信息的,又如何知道哪些bean需要被管理,?Bean信息定义对象为BeanDefinition,这里我们将详细讲述BeanDefinition的继承结构以及各个BeanDefinition之间的关系,同时会剖析Spring是如何扫描得到所有需要被管理的BeanDefinition的;
2、实例化,也就是创建对象,这里我们将详细剖析Spring在这里如何推断构造函数,以及Spring提供的扩展点,即实例化前和实例化后两个扩展点的实现原理;
3、属性填充,也就是给实例的属性赋值,这里我们将详细剖析Spring如何判断哪些是属性注入点,以及如何完成属性填充;
4、初始化,初始化到底是什么?它做了哪些事情?以及Spring在这里提供的扩展点,即初始化之前和之后两个扩展点的实现原理;
5、最后就是销毁实例对象,Spring是如何销毁一个对象的,在销毁之前它又做了哪些准备?
6、详细解答几个面试中的常见问题:如何解决循环依赖问题以及AOP是在哪里实现如何实现的?
7、后续我们会陆续剖析Spring与其他框架的整合原理。