Spring 源码解析系列

    Spring作为J2EE程序员接触最多的框架之一,不乏许多设计巧妙的亮点,包括松耦合,以及提供了许多可自定义扩展点,开发人员可以在此基础上很容易就实现业务代码,而无需关心诸如bean管理、参数校验绑定等复杂的处理逻辑。

    本系列文章将涵盖一个使用 Spring 搭建起来的 web 应用,从服务器启动到一条请求的真正处理的全过程分析。

    源码将基于4.3.11.RELEASE 版本。

 

    言归正传,首先来说说“容器启动”,作为 Spring 和 Servlet 容器连接的桥梁——ContextLoader,它实现了 ServletContextListener 接口,用于监听 Servlet 容器启动和销毁,以便触发回调,所以了解 Spring 的启动过程,你需要阅读:

    Spring源码解析(一)——容器启动

    当你阅读完上篇 ,你大致会对“容器启动”做了哪些事有了大致的了解。上篇末尾留下的 ConfigurableWebApplicationContext.refresh() 方法调用则涵盖了许多复杂的逻辑,都包含哪些?你需要阅读:

    Spring源码解析(二)——容器刷新

    当你阅读完上篇 ,会得到一个“容器刷新的概览图”,它的每步都是由一个个命名良好的方法封装起来的,代码思路十分清晰。但其中涉及到的两大块:容器创建(obtainFreshBeanFactory)、实例创建(finishBeanFactoryInitialization)属于大头,单独讲解。

    容器创建

  • Spring源码解析(三)——容器创建
    • 该篇会讲述 ApplicationContext 的创建过程,但还是个空壳,它会将 xml 配置文件解析成 Document 对象以便后面标签的解析工作;
  • Spring源码解析(四)——默认标签解析
    • 有了上面的准备,这篇主要是对 <import>、<alias>、<bean>、<beans>四大常规标签的解析;
  • Spring源码解析(五)——自定义标签解析
    • 有了常规标签,仅能满足一些 bean 的管理,没办法进行一些高级特性如 aop、事务等复杂配置支持,因此就需要自定义标签,并且配上相应的解析器。这篇讲述了常见自定义标签与解析器的对应关系,并以 <component-scan> 标签解析为例进行讲解。其余标签的解析可以自行研究。

    实例创建

  • Spring源码解析(六)——实例创建(上)
    • 经过上面容器创建的准备,已经能获取到需要创建实例的 “元数据”,该篇将讲解 Spring 源码中使用最广的方法之一——getBean 。将涉及到 Singleton、Prototype、以及其他作用域实例的获取。
  • Spring源码解析(七)——实例创建(中)
    • 上面的获取逻辑,比如 Singleton 类型实例的获取会从缓存中返回,Prototype 类型的实例则每次都要创建,无论哪种类型,总需要在对应的时机创建。本篇将讲述 createBean 方法的实现。
  • Spring源码解析(八)——实例创建(下)
    • 经过上篇的处理,容器已经将 bean 进行了实例化(可理解为 new 了一个对象),但依赖还未注入,包括一些生命周期相关的方法也为执行。本篇将分析实例的初始化逻辑(文末将附上 Spring bean生命周期图)。

 

    经过多步处理,Spring 容器的架子终于搭建起来(即 IOC 容器),接下来要来分析下 Spring 如何利用这些实例对请求进行处理。(其中子容器的创建过程跟父容器类似,将在下面的篇章一笔带过)

 

    对于 J2EE 程序员来说,Servlet 程序应该都有所了解,实现 Servlet.service 方法,并将其配置到 web.xml 即可。其实 SpringMVC 也就是做了对 Servlet 的实现——DispatcherServlet ,并且抽象出许多公用组件进行封装,来便捷业务开发,那么 DispatcherServlet 都有哪些组件呢?你需要了解一下:

    SpringMVC源码解析(一)——初始化

    那么最关心的,请求和处理如何关联起来的,你需要阅读:

    SpringMVC源码解析(二)——HandlerMapping

    但是 HandlerMapping 的实现又有多种,相应的就有多种不同类型的 Handler,它们的接口不尽相同。通过映射关系我们找到了请求对应的 Handler 如何被调用,你需要了解 HandlerAdapter 适配器

    SpringMVC源码解析(三)——HandlerAdapter

    经过以上的准备工作,来看下一次请求的处理过程,涉及 doServicedoDispatch

    SpringMVC源码解析(四)——请求处理

    这一步的执行逻辑会用到前两篇的内容,如果有衔接不上的可以回顾下。通过以上处理,已经获取到了 ModelAndView 返回,这里封装了业务代码返回的模型和视图,又或者在执行当中抛出的异常。Spring 针对异常是如何处理的?你需要阅读:

    SpringMVC源码解析(五)——视图处理

    

    到此为止,基于 Spring 框架的 web 应用主流程已分析完毕。个别地方没有详细展开,有兴趣的可以自行研究下。

    总结下,阅读源码的过程,不是跌入 “如何实现” 的漩涡,不要在一些不能理解的地方纠缠,因为实现的方式有千万种。我们要学习的应该是源码的编程思想、模式,这才是对日常开发最有益处的。其次,Spring 提供了大量的工具类,在阅读过程中要多多收集,有时候这将加速我们的开发进度,切忌“重复造轮子”。

    最后,各位如果在阅读过程中有疑问,或是发现分析有误的地方,请留言或私信,我将尽快更正。

转载于:https://my.oschina.net/marvelcode/blog/1842257

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值