作为Java工程师,你真的知道阅读Spring源码的重要性吗?

2019年2月17日 239点热度 0人点赞 0条评论
图片

来源 | 异步 | 文末赠书图片


Java开发人员都知道,阅读源码是非常好的学习方式,在我们日常工作中或多或少都会接触一些开源代码,比如说最常用的Struts、Hibernate、Spring,这些源码的普及与应用程度远远超过我们的想象,正因为很多人使用,也在推动着源码不断地完善。这些优秀的源码中有着多年积淀下来的精华,这些精华是非常值得我们学习的,不管我们当前是什么水平,通过反复阅读源码,能力都会有所提升,小到对源码所提供的功能上的使用更加熟练,大到使我们的程序设计更加完美优秀。但是,纵观我们身边的人,能够做到通读源码的真的是少之又少,究其原因,不外乎以下几点。


  • 阅读源码绝对算得上是一件费时费力的工作,需要读者耗费大量的时间去完成。而作为开发人员,毕竟精力有限,实在没办法拿出太多的时间放在源码的阅读上。


  • 源码的复杂性。任何一款源码经历了多年的发展与提炼,其复杂程度可想而知。当我们阅读源码的时候,大家都知道需要通过工具来跟踪代码的运行,进而去分析程序。但是,当代码过于复杂,环环相扣绕来绕去的时候,跟进了几十个甚至几百个函数后,这时我们已经不知道自己所处的位置了,不得不再重来,但是一次又一次地,最终发现自己根本无法驾驭它,不得不放弃。


  • 有些源码发展多年,会遇到各种各样的问题,并对问题进行了解决,而其中有些问题对于我们来说甚至可以用莫名其妙来修饰,有时候根本想不出会在什么情况下发生。我们查阅各种资料,查询无果后,会失去耐心,最终放弃。


无论基于什么样的原因,放弃阅读源码始终不是一个明智的选择,因为你失去了一个跟大师学习的机会。而且,当你读过几个源码之后就会发现,它们的思想以及实现方式是相通的。这就是开源的好处。随着各种开源软件的发展,各家都会融合别家优秀之处来不断完善自己,这样,到最后的结果就是所有的开源软件从设计上或者实现上都会变得越来越相似,也就是说当你读完某个优秀源码后再去读另一个源代码,阅读速度会有很大提升。


以我为例,Spring是我阅读的第一个源码,几乎花费了近半年的时间,其中各种煎熬可想而知,但是当我读完Spring后再去读MyBatis,只用了两周时间。当然,暂且不论它们的复杂程度不同,至少我在阅读的时候发现了很多相通的东西。当你第一次阅读的时候,重点一定是在源码的理解上,但是,当读完第一个源码再去读下一个的时候,你自然而然地会带着批判或者说挑剔的眼光去阅读:为什么这个功能在我之前看的源码中是那样实现的,而在这里会是这样实现的?这其中的道理在哪里,哪种实现方式更优秀呢?而通过这样的对比及探索,你会发现,自己的进步快得难以想象。


我们已经有些纠结了,既然阅读源码有那么多的好处,但是很多读者却因为时间或者能力的问题而不得不放弃,岂不是太可惜?为了解决这个问题,作者撰写了《Spring源码深度解析 第2版》,总结了自己的研究心得和实际项目经验,希望能对正在Spring道路上摸索的同仁提供一些帮助。这本书是畅销长销Spring图书全新升级版本,基于Spring 5.x编写庖丁解牛式讲解Spring工作原理 。

图片

《Spring源码深度解析(第2版)》

作者:郝佳


图片

扫描二维码,一键购买


本书特点

 

本书完全从开发者的角度去剖析源码,每一章都会提供具有代表性的实例,并以此为基础进行功能实现的分析,而不是采取开篇就讲解容器怎么实现、AOP怎么实现之类的写法。在描述的过程中,本书尽可能地把问题分解,使用剥洋葱的方式一层一层地将逻辑描述清楚,帮助读者由浅入深地进行学习,并把其中的难点和问题各个击破,而不是企图一下让读者理解一个复杂的逻辑。

在阅读源码的过程中,难免会遇到各种各样的生僻功能,这些功能在特定的场合会非常有用,但是可能多数情况下并不是很常用,甚至都查阅不到相关的使用资料。本书中重点针对这种情况提供了相应的实用示例,让读者更加全面地了解Spring所提供的功能,使读者对代码能知其然还知其所以然。

本书按照每章所提供的示例跟踪Spring源码的流程,尽可能保证代码的连续性,确保读者的思维不被打乱,让读者看到Spring的执行流程,尽量使读者在阅读完本书后,即使在不阅读Spring源码的情况下也可以对Spring源码进行优化,甚至通过扩展源码来满足业务需求(这对开发人员来说是一个很高的要求)。本书希望能帮助读者全面提升实战能力。

本书结构

 

本书分为3部分:核心实现、企业应用和Spring Boot。

第1部分,核心实现(第1~7章):是Spring功能的基础,也是企业应用部分的基础,主要对容器以及AOP功能实现做了具体的分析。如果读者之前没有接触过Spring源代码,建议认真阅读这个部分,否则阅读企业应用部分时会比较吃力。

第2部分,企业应用(第8~13章):在核心实现部分的基础上围绕企业应用常用的模块进行讨论,这些模块包括Spring整合JDBC、Spring整合MyBatis、事务、SpringMVC、远程服务、Spring消息服务等,旨在帮助读者在日常开发中更加高效地使用Spring。

第3部分,Spring Boot(第14章):对近期流行的Spring Boot的体系原理进行分析,剥离其神秘的面纱。Spring Boot作为Spring外的一个独立分支,可以说将Spring的扩展能力应用得出神入化,仔细研读后一定会受益匪浅。

Spring整体架构和环境搭建

 

Spring是于 2003 年兴起的一个轻量级Java开源框架,由Rod Johnson在其著作Expert One-On-One J2EE Design and Development中阐述的部分理念和原型衍生而来。Spring是为了解决企业应用开发的复杂性而创建的,它使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发,从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。

1.1 Spring的整体架构


Spring框架是一个分层架构,它包含一系列的功能要素,并被分为大约20个模块,如图1-1所示。

图片

图1-1 Spring整体架构图

这些模块被总结为以下几部分。

1.Core Container

Core Container(核心容器)包含有Core、Beans、Context和Expression Language模块。

Core和Beans模块是框架的基础部分,提供IoC(转控制)和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。

  • Core模块主要包含Spring框架基本的核心工具类,Spring的其他组件都要用到这个包里的类,Core模块是其他组件的基本核心。当然你也可以在自己的应用系统中使用这些工具类。

  • Beans模块是所有应用都要用到的,它包含访问配置文件、创建和管理bean以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类。

  • Context模块构建于Core和Beans模块基础之上,提供了一种类似于JNDI注册器的框架式的对象访问方法。Context模块继承了Beans的特性,为Spring核心提供了大量扩展,添加了对国际化(例如资源绑定)、事件传播、资源加载和对Context的透明创建的支持。Context模块同时也支持J2EE的一些特性,例如EJB、JMX和基础的远程处理。ApplicationContext接口是Context模块的关键。

  • Expression Language模块提供了强大的表达式语言,用于在运行时查询和操纵对象。它是JSP 2.1规范中定义的unifed expression language的扩展。该语言支持设置/获取属性的值,属性的分配,方法的调用,访问数组上下文(accessiong the context of arrays)、容器和索引器、逻辑和算术运算符、命名变量以及从Spring的IoC容器中根据名称检索对象。它也支持list投影、选择和一般的list聚合。

2.Data Access/Integration

Data Access/Integration层包含JDBC、ORM、OXM、JMS和Transaction模块。

  • JDBC模块提供了一个JDBC抽象层,它可以消除冗长的JDBC编码和解析数据库厂商特有的错误代码。这个模块包含了Spring对JDBC数据访问进行封装的所有类。

  • ORM模块为流行的对象-关系映射API,如JPA、JDO、Hibernate、iBatis等,提供了一个交互层。利用ORM封装包,可以混合使用所有Spring提供的特性进行O/R映射,如前边提到的简单声明性事务管理。

Spring框架插入了若干个ORM框架,从而提供了ORM的对象关系工具,其中包括JDO、Hibernate和iBatisSQL Map。所有这些都遵从Spring的通用事务和DAO异常层次结构。

  • OXM模块提供了一个对Object/XML映射实现的抽象层,Object/XML映射实现包括JAXB、Castor、XMLBeans、JiBX和XStream。

  • JMS(Java Messaging Service)模块主要包含了一些制造和消费消息的特性。

  • Transaction模块支持编程和声明性的事务管理,这些事务类必须实现特定的接口,并且对所有的POJO都适用。

3.Web

Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供了上下文。所以,Spring框架支持与Jakarta Struts的集成。Web模块还简化了处理大部分请求以及将请求参数绑定到域对象的工作。Web层包含了Web、Web-Servlet、Web-Struts和Web-Porlet模块,具体说明如下。

  • Web模块:提供了基础的面向Web的集成特性。例如,多文件上传、使用servlet listeners初始化IoC容器以及一个面向Web的应用上下文。它还包含Spring远程支持中Web的相关部分。

  • Web-Servlet模块web.servlet.jar:该模块包含Spring的model-view-controller(MVC)实现。Spring的MVC框架使得模型范围内的代码和web forms之间能够清楚地分离开来,并与Spring框架的其他特性集成在一起。

  • Web-Struts模块:该模块提供了对Struts的支持,使得类在Spring应用中能够与一个典型的Struts Web层集成在一起。注意,该支持在Spring 3.0中已被弃用。

  • Web-Porlet模块:提供了用于Portlet环境和Web-Servlet模块的MVC的实现。

4.AOP

AOP模块提供了一个符合AOP联盟标准的面向切面编程的实现,它让你可以定义例如方法拦截器和切点,从而将逻辑代码分开,降低它们之间的耦合性。利用source-level的元数据功能,还可以将各种行为信息合并到你的代码中,这有点像.Net技术中的attribute概念。

通过配置管理特性,Spring AOP模块直接将面向切面的编程功能集成到了Spring框架中,所以可以很容易地使Spring框架管理的任何对象支持AOP。Spring AOP模块为基于Spring的应用程序中的对象提供了事务管理服务。通过使用Spring AOP,不用依赖EJB组件,就可以将声明性事务管理集成到应用程序中。

  • Aspects模块提供了对AspectJ的集成支持。

  • Instrumentation模块提供了class instrumentation支持和classloader实现,使得可以在特定的应用服务器上使用。

5.Test

Test模块支持使用JUnit和TestNG对Spring组件进行测试。


本文内容摘自《Spring源码深度解析 第2版》

图片

《Spring源码深度解析(第2版)》

作者:郝佳


图片

扫描二维码,一键购买

畅销长销Spring图书全新升级版本 基于Spring 5.x编写庖丁解牛式讲解Spring工作原理 。

本书从核心实现、企业应用和Spring Boot这3个方面,由浅入深、由易到难地对Spring源码展开了系统的讲解,包括Spring 整体架构和环境搭建、容器的基本实现、默认标签的解析、自定义标签的解析、bean的加载、容器的功能扩展、AOP、数据库连接JDBC、整合MyBatis、事务、SpringMVC、远程服务、Spring消息、Spring Boot体系原理等内容。

...  The End  ...

今日互动话题

        

  #分享你对本书的看法#

异步君将抽取 3 位读者赠书1本

留言+转发朋友圈 丨截止2月22日


图片

异步图书

聊聊图书背后的故事

图片



邀请有礼

点击此处,邀请10名好友关注异步图书10天,即可免费获得异步新书


点击阅读原文5折购买《Spring源码深度解析 第2版》

点个好看增加中奖概率?

5350作为Java工程师,你真的知道阅读Spring源码的重要性吗?

root

这个人很懒,什么都没留下

文章评论