Spring以下几个模块的核心原理简述如下:

  1. Spring IoC:通过读取Xml或注解Bean定义转换成内存表示的BeanDefinition,根据BeanDefinition的信息通过反射实例化,期间会对依赖Bean进行注入;实例化完成后,通过BeanPostProcess作为入口,使用Cglib或Jdk方式生成代理对象,织入代理对象中含有AOP上下文。
  2. Spring AOP:代理运行时获得匹配当前方法的织入逻辑链,由ReflectiveMethodInvocation执行织入逻辑链和目标方法;各种通知底层统一由环绕通知实现;AspectJ注解表达的AOP方式,底层使用原Spring AOP,只是把AspectJ注解转换为了Spring概念中的Advice和Point。
  3. Spring事务管理:本质是管理Connection事务提交行为。Spring事务框架设计理念基本原则:让事务管理关注点与数据访问管理点相分离。通过AOP把事务管理切入业务逻辑中,在业务代码执行前,设置开启事务,业务处理处理完成后,提交事务(回滚也看成提交的一种)。
  4. Spring 缓存管理:通过AOP把缓存管理切入业务逻辑,提供我们一套方便使用的注解,只负责缓存的生命周期管理,不负责缓存的存储。
  5. Spring MVC:底层实现基于Servlet和Spring容器,并通过优秀的设计保证了很好的扩展性。具体实现时以DispatcherServlet作为框架核心。DispatcherServlet本身是一个Servlet,其依靠Servlet为框架“引流”,在获得“流量”后,协调众多组件通力配合完成Web请求并返回响应。

到这里,Spring涉及到几个大的点:IoC,AOP,事务,缓存,Spring MVC基本上我们都已一一学习,对它们的大致原理基本掌握。个人感觉以下几点是我们学习的榜样:

  1. 程序扩展性:通过定义规范和良好的编程范式,提供诸多扩展点;
  2. 整合第三方技术能力:无论代理生成,还是ORM框架支持,视图渲染等;
  3. 框架向后兼容性:版本升级时,基本我们不需要做调整;
  4. 设计模式使用:模板方法模式,工厂模式,代理模式,适配器模式,组合模式等;
  5. 数据抽象能力:实现过程中用到的各种基础组件;
  6. 合理使用缓存:在代理运行/SpringMVC中大量使用了缓存,以提高性能;
  7. 代码规范:命名明确,层次划分合理,大量单元测试类,注释详细,文档全面;
  8. 使用方便:对开发者屏蔽技术上的复杂性,快速接入;

还有其他更多的优先,就不一一列举,更多的亮点待我们去发现。个人感觉在阅读源码时有以下几点建议:

  1. 首先从核心类开始,掌握程序大致流程,不要求全懂:跟着Spring揭秘开始是不错的主意;
  2. 在看类注释时:如果英文欠缺或由于诸多文档注解影响阅读,可以参考官方API文档,也要留意看注释上的@see相关类;
  3. 在逻辑梳理的过程,推荐使用UML中的时序图/类图,避免看的过程中迷失方向;
  4. 需类方法运行时:优先尝试运行测试类,如有必要搭建简单Web项目运行;
  5. 合理开发工具使用:如查看方法的调用链,Debug回退,搜索等;
  6. 聚焦专注点:如Spring中大量使用了缓存,我们看的过程中先假设没有缓存,明白后再看有缓存的情况;
  7. 推荐手头有几本参考书:因每个作者关注点与出版年代不同,一些知识可以相互印证和补充;
  8. 推荐书写博客,一般第一遍看懂只是朦胧懂了,不一定说的出来,写的过程能加深理解及勘误;

到这里Spring源码学习就暂告一段落,后面再继续学习Spring更多的细节点。希望一系列博客对大家学习Spring源码有所帮助,也祝大家在学习过程中有更多的收获。

快速导航: