Spring 5企业级开发实战(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-12 20:11:04

点击下载

作者:周冠亚、黄文毅

出版社:清华大学出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Spring 5企业级开发实战

Spring 5企业级开发实战试读:

前言

Spring在如今的Java企业开发中占据十分重要的地位。一路走来,作者经历过的上百个项目无一例外都是使用Spring开发的。2017年9月Spring 5发布了通用版本(GA),标志着自2013年12月以来第一个主要Spring Framework版本诞生。本书从企业实战角度出发,讲解最新版本的Spring 5.0\5.1的新特性,并将常见互联网技术与Spring集成,力争让读者通过本书能够又快又好地掌握Spring企业级开发技能,并能学以致用。

本书涵盖Spring基础知识讲解,Spring 5新特性和Spring集成开发等知识。本书从结构上可以分三部分,第一部分是Spring基础篇,介绍Spring核心概念和原理,涉及第1章~第3章。第二部分是Spring 5高级特性篇,涉及第4章~第9章。第三部分是Spring系统集成篇,主要讲解Spring框架与互联网公司常用的技术集成开发,涉及第10章~第19章。附录部分还介绍了本书涉及的以及在面试中常见的设计模式。本书结构

本书共19章和1个附录,各章内容概述如下:

第1章 介绍Spring开发所需的环境和工具。包括JDK的安装,Intellij IDEA安装、Tomcat安装和配置、Maven安装。

第2章 对Spring框架核心概念IoC容器进行讲解,并通过代码分析的方式阐述IoC容器的实现原理。

第3章 对Spring框架核心概念AOP进行讲解,并说明如何通过不同的方式实现AOP,最后通过代码解析的方式阐述AOP的实现原理。

第4章 概述Spring 5的新特性。

第5章 概述Java 8的一些新特性,这些特性在Spring 5中得到了支持。

第6章 讲解使用Spring 5的新特性WebFlux进行编程和Reactor编程。

第7章 讲解Spring 5提供的响应式客户端编程。

第8章 讲解Spring 5集成Kotlin进行编程。

第9章 讲解更多Spring 5的新特性及细节。

第10章 讲解Spring集成Log4j2进行日志控制。

第11章 讲解Spring如何集成Spring MVC模块进行Web开发,并分析Spring MVC底层代码实现。

第12章 讲解Spring如何集成MyBatis进行数据库持久层开发,并分析MyBatis框架底层的代码。

第13章 讲解Spring对事务的支持,并分析Spring事务管理的底层代码实现。

第14章 讲解Spring集成Redis开发,并分析Redis各种不同部署方式之间的区别,本章最后分享在高并发场景下使用Redis需要注意的一些要点。

第15章 讲解ZooKeeper如何进行开发,并分析ZooKeeper在特定场景下的一些高级用法。

第16章 讲解Spring如何集成Kafka进行开发,并分析Kafka的核心架构。

第17章 讲解Spring如何集成Mycat进行分库分表开发,及如何将Spring、Mybatis和Mycat集成进行数据库持久化层的开发。

第18章 讲解Spring如何集成Sharding-JDBC进行分库分表开发,并讲解一些Sharding-JDBC的高级特性。

第19章 讲解Spring如何集成Dubbo进行RPC服务开发,并分析Dubbo框架的底层代码。

附录A 讲解本书代码分析过程中的设计模式和企业开发过程中常见的设计模式。本书预备知识Java基础

需要读者掌握Java SE基础知识,这是最基本的也是最重要的。Linux基础

本书讲解的Spring集成中间件开发部分,中间件都是基于Linux服务器进行部署的,因此读者应当掌握常用的Linux命令。数据库基础

本书会涉及Spring对事务的支持和Spring集成Mycat或Sharding-JDBC进行分库分表操作,因此读者对数据库基础知识应有较好的掌握。分布式系统基础

本书Spring系统集成部分会涉及当前互联网公司比较主流的分布式技术,读者需要对分布式系统的基础知识有一定的了解。本书使用的软件版本

本书使用到的开发环境如下:• 操作系统MacOS 10.14.3• 开发工具Intellij IDEA 2018.1• JDK版本1.8• Tomcat 9.0.10• maven-3.5.0• Spring最新版5.1.5.RELEASE

本书系统集成部分使用到的多种组件的具体版本请参考对应章节。读者对象

本书适合所有Java编程语言开发人员,所有对Spring感兴趣的开发人员,对分布式系统感兴趣的开发人员以及对各类技术原理有求知欲的开发人员。源代码下载

GitHub源代码下载地址:https://github.com/online-demo/spring5projectdemo.git勘误与交流

限于笔者水平和写作时间有限,欢迎大家通过电子邮件等方式批评指正。

笔者的邮箱:zhouguanya20@163.com huangwenyi10@163.com

笔者的博客:http://blog.csdn.net/huangwenyi1010

笔者的微信公众号:A_GallopingSnail致谢

本书能够顺利出版,首先要感谢清华大学出版社王金柱编辑给笔者一次与各位读者分享技术、交流学习的机会,感谢王金柱编辑在本书出版过程的辛勤付出。感谢好友黄文毅,也是笔者的同事,对笔者在写作思路和排版上的帮助和支持。

感谢汉海信息技术(上海)有限公司(简称美团点评),书中很多的知识点和项目实战经验都来源于“美团点评”,感谢主管章成峰、导师吕波和贾钧翔以及同事叶雄和孙成飞,感谢“饿了么”资深架构师唐斌对笔者技术和学习上的支持,感谢行业前辈杨继龙对笔者职业生涯的提点,感谢笔者的好友黄子涵对笔者写作进度的监督和指导,感谢英语老师吴定山对笔者英语能力的培养。

谨以此书献给我敬爱的父母,愿他们健康长寿。周冠亚2019年2月24日第一篇Spring基础篇第1章 环境搭建

本章主要介绍学习Spring 5之前的环境准备,Spring 5项目各个模块介绍,以及开发Spring 5项目需要用到的一些开发工具,并在本章末尾搭建一个可运行的Spring MVC项目。1.1 Spring介绍1.1.1 Spring设计目标

Spring是一个于2003年兴起的轻量级的Java开源开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。Spring让开发人员有更多的精力投入到业务逻辑开发中,而不需要将其应用程序绑定到特定的部署环境,是为了降低企业应用开发的复杂性而创建的。Spring不是创造轮子(技术、框架),而是使现有的轮子运转得更好的工具。可以把Spring理解成一个大容器,这个容器可以整合现有的各种技术框架。Spring框架的主要优势是方便各种框架集成,降低了Java EE开发的难度。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。Spring的用途不限于服务器端应用程序的开发。

Spring框架提供了很多子模块供开发人员使用。1.1.2 Spring各个子模块

Spring是一个大容器,可以集成各种技术。如图1-1所示是Spring支持的各种技术。图1-1 Spring支持的技术体系

下面依次介绍Spring支持的各种技术。(1)Core Container

Spring的核心容器由Beans、Core、Context、SpEL等模块组成。所有Spring的其他模块都是建立在Core Container基础模块上的。该模块规定了创建和维护Bean的方式,提供了控制反转(IoC)和依赖注入(DI)等特性。(2)Data Access/Integration

数据访问/集成模块提供了对JDBC、ORM、OXM、JMS和Transaction等模块的集成。使主流的ORM框架,持久化框架和消息中间件可以很方便地集成到Spring中,降低开发人员对这些框架的维护成本,提升了开发效率。(3)Web模块

Web模块提供了对Web开发相关技术的集成,对开发模型-视图-控制器(MVC)项目提供便利。(4)AOP模块

AOP模块提供了AOP联盟提倡的面向切面编程的实现环境。AOP将代码按功能进行分离,降低了模块间代码的耦合度。(5)Test模块

Test模块支持JUnit和TestNG等单元测试模块的集成,还提供了mock对象,使开发人员可以更加独立的测试代码。1.1.3 Spring使用场景(1)管理依赖的资源

在企业开发中,经常需要管理各种配置文件,如JDBC连接配置文件,ORM配置文件等。可以通过Spring管理这些文件。如加载JDBC的配置文件jdbc.properties就可以使用如下代码方式配置Spring,这样Spring启动时会在此路径下自动搜索名称为jdbc.properties的配置文件,并将其加载到内存中: (2)Bean管理

一个企业项目中,会有很多Bean,每次都手动创建和管理这些Bean的对象是很低效的。Spring提供了管理Bean的IoC容器,并在需要用到相关Bean的时候,提供依赖注入(DI)将相关的Bean注入。(3)事务管理

Spring提供的事务管理,使开发人员在做数据库操作时,无须再手动执行对数据库的提交或回滚操作,并且Spring还提供了对事务传播的支持,可以实现更加复杂的事务嵌套的逻辑,对数据一致性提供了更好的支持。

Spring的使用场景远不止这里提到的三点,更多Spring使用场景,请见Spring系统集成篇。1.1.4 Spring与Spring MVC的关系

Spring和Spring MVC两者名字类似,但是两者却有着本质的不同。Spring是一个巨大的容器,可以集成各种技术。Spring MVC是一个Web技术,Spring MVC可以集成到Spring中。用数学上集合的概念来解释,Spring MVC是Spring的一个子集。1.1.5 Spring 5高级特性

截止本书出版,Spring最新版本已经升级到了5.1版本。Spring 5相比于Spring之前的历史版本,带来了以下新的特性:• Spring 5整个框架基于Java 8• 支持HTTP/2• Spring Web MVC支持最新API• Spring WebFlux响应式编程• 支持Kotlin函数式编程

更多有关Spring 5的高级特性请见Spring 5高级特性篇。1.2 环境准备1.2.1 安装JDK

JDK(Java SE Development Kit)建议使用JDK 1.8及以上的版本。JDK官方下载路径:http://www.oracle.com/technetwork/java/javase/downloads/index.html,安装过程此处不过多描述,读者可以根据各自的电脑操作系统配置选择合适的JDK安装包进行安装,笔者电脑的操作系统是MacOS 10.14.3。安装包下载完成之后,双击下载软件,按照提示安装即可。

安装好JDK后,在英文输入法状态下,按“command+空格”组合键,调出Spotlight搜索界面,输入terminal选择【终端】然后按Enter键,便可以快速启动终端,具体如图1-2所示。图1-2 打开terminal终端

在【终端】输入"java -version",如果看到具体的JDK版本,则说明JDK安装成功,如图1-3所示。图1-3 验证JDK安装成功1.2.2 安装IntelliJ IDEA

在Intellij IDEA的官方网站http://www.jetbrains.com/idea/可以免费下载IDEA。下载完IDEA后,运行安装程序,按提示安装即可。本书使用的Intellij IDEA的版本为2018.1.2,也可以使用其他版本的IDEA,版本只要不过低即可。安装成功之后,软件打开界面如图1-4所示。图1-4 Intellij IDEA软件打开界面1.2.3 安装Apache Maven

Apache Maven是目前流行的项目管理和构建自动化工具,可以通过Maven的官网http://maven.apache.org/download.cgi下载最新版的Maven。本书的Maven版本为apache-maven-3.5。

下载完后解压缩即可,例如解压到/usr/local/Cellar/maven@3.5/3.5.4/libexec。

接下来讲解Maven如何集成到IntelliJ IDEA中。

在Intellij IDEA界面中,选择File→Settings,在出现的窗口中找到Maven选项,分别把Maven home directory、User settings file、Local repository设置成读者自己的Maven的相关目录,如图1-5所示。图1-5 Intellij IDEA集成Apache Maven窗口1.2.4 安装Apache Tomcat

Apache Tomcat是目前主流的Web容器,可以在Apache Tomcat官网下载。下载地址:https://tomcat.apache.org/。本书的Maven版本为apache-tomcat-9.0.10,下载图1-6 Intellij IDEA集成Apache 后将压缩文件解压。在Intellij IDEATomcat窗口中集成Apache Tomcat,如图1-6所示。

集成Apache Tomcat后,在Intellij IDEA中启动Tomcat,Intellij IDEA控制台输出如图1-7所示,此时Apache Tomcat已经启动。图1-7 Intellij IDEA集成Apache Tomcat启动窗口1.3 快速搭建Spring 5项目1.3.1 使用IntelliJ IDEA创建Spring 5+Spring MVC项目

本节将通过Spring 5+Spring MVC快速搭建一个Hello World Web程序。搭建本书项目全部是基于Spring 5.1开发。搭建分为以下步骤。(1)在pom中引入Spring相关依赖。

一个最简单的Spring MVC项目只需要javax.servlet-api和spring-webmvc这两个jar包。在maven项目的pom.xml中加入这两个jar包的依赖,具体代码如下:(2)创建HelloWorldController,输出文字Hello World。

Controller是Spring MVC控制层模块,创建一个简单Controller,提供“/hello”这个HTTP接口,然后使用浏览器访问该接口,即可输出文字“Hello World”。(3)配置文件springmvc.xml。定义扫描包的路径和视图解析器。(4)配置web.xml文件。指定Spring MVC核心Servlet和相关的配置文件即可:1.3.2 测试部署

使用Intellij IDEA集成的Tomcat发布整个Spring MVC应用,在浏览器中访问http://localhost:8080/hello接口,效果如图1-8所示。图1-8 Intellij IDEA集成Apache Tomcat启动窗口1.4 小 结

本章主要介绍了Spring技术体系的构成,并初步讲解了构建Spring项目需要用到的一些开发工具的安装和使用。通过Spring构建一个简单的Spring MVC项目,再通过浏览器访问Spring MVC项目提供的HTTP接口,即可打印文字,例如Hello World。下一章将讲解Spring框架的核心概念——IoC。第2章 Spring IoC容器原理

Spring框架在企业开发中,是很常见很基础的技术。本章将讲解Spring框架的核心概念——IoC。本章从简单的案例入手,一步步深入剖析IoC的核心思想。在本章最后,通过对Spring代码进行解析,揭秘Spring IoC实现的方式。2.1 IoC容器揭秘2.1.1 IoC的概念

IoC是Inversion of Control的简写,翻译成汉语就是“控制反转”。IoC并不是一门技术,而是一种设计思想。在没有IoC设计的场景下,开发人员在使用所需的对象时,需手动创建各种对象,如new Student()。如图2-1所示是传统Java开发方式。

有了IoC这样的设计思想,在开发中,意味着将设计好的对象交给容器管理,而不再是像传统的编程方式中,在对象内部直接控制对象。如图2-2所示是使用IoC的Java开发方式。

如何理解IoC呢?从IoC的字面意思上,无非是要把握好两块:控制、反转。下面将从这两方面着手分析IoC。1. 控制:由谁控制,控制了什么?

在传统Java程序设计中,开发人员直接在某个对象内部通过new关键字创建另一个对象,是开发人员主动去创建依赖对象;而IoC的设计思想,是通过专门的对象容器来创建和维护对象。于是就可以解答这个问题了。对于谁控制这个问题的回答是,由IoC容器来控制;对于控制了什么这个问题的回答是:控制了对象。图2-1 传统Java开发方式图2-2 使用IoC的Java开发方式2. 反转:什么是反转,反转了哪些方面?

在传统Java应用程序开发中,由开发人员在对象中主动控制其需要的依赖对象;而反转则是把对象依赖的过程颠倒了,即开发人员不再控制其依赖对象,而是由容器来帮助开发人员创建其需要的对象。于是就可以解答这个问题了。对于什么是反转这个问题的回答是,由容器帮开发人员创建依赖对象,对象只是被动地接受依赖对象,对象的控制权不再是开发人员,而是容器;对于反转了哪些方面这个问题的回答是,开发人员需要依赖的对象被反转。

现在再来回顾一下IoC的概念就好理解了,IoC——控制反转,即对象的控制权转移了,从开发人员转移到对象容器了。2.1.2 依赖倒置原则

软件工程理论中的六大设计原则。1. 单一职责原则

不存在多于一个的因素导致类的状态发生变更,即一个类只负责一项单一的职责。2. 里氏替换原则

基类出现的地方都可以用其子类进行替换,而不会引起任何不适应的问题。3. 接口隔离原则

客户端不应该依赖于其不需要的接口,类间的依赖关系应该建立在最小的接口之上。4. 迪米特法则

一个对象对其他对象有最少的了解。5. 开闭原则

软件设计对于扩展是开放的(Open for extension),即模块的行为是可以扩展的。

软件设计对于修改是关闭的(Closed for modification),即模块的行为是不可修改的。6. 依赖倒置原则

高层次的模块不应该依赖于低层次的模块,都应该依赖于抽象。

如图2-3所示,CTO是整个组织架构的高层模块,其他模块都是CTO的底层模块。同理,研发1部是业务研发1组和业务研发2组的高层模块,业务研发1组和业务研发2组是研发1部的底层模块,以此类推。图2-3 组织架构示意图

抽象不应该依赖于具体实现,具体实现应该依赖于抽象。例如,人就是一个抽象,具体到黄种人、白种人和黑种人就是具体的实现。具体对应到软件工程领域,抽象可以是抽象类或接口。具体实现就是继承或实现这些抽象类或接口的类。如下代码就是一个典型的抽象和具体实现:

通过上述代码,分析了依赖倒置原则的定义后,下面将对比不遵循依赖倒置原则和遵循依赖倒置原则的两种不同软件设计风格。

假设有如下场景,一个人,需要通过某种交通工具去上班。在不遵循倒置原则的情况下,软件的设计风格如下。

当员工住的离公司比较近的时候,骑自行车上班即可:

当员工住的离公司远,需要改乘公交上班时,代码需要修改成如下:

如果员工买车,就不需要坐公交上班,这时对于Person要加入新的对象如Car来满足新的需求。

如图2-4所示,按照以上的案例设计,对于每一次的需求更新,对Person类的修改太多,几乎每一次需求变更,都要对Person进行一次重构,显然这种做法不合适。通过分析可以得知,Person是依赖于Bike、Bus的。Person类的go()方法功能完全依赖于bike和bus属性的go()方法。直接依赖于具体实现,带来的后果就是每次需求变更,必然要对代码进行重构。图2-4 传统Java开发方式

接下来对上述的设计方法进行优化,对Person引进抽象。将Person需要使用的交通工具抽象成一个接口Movable,接口中有个go()方法。具体代码如下:

让Person依赖Movable接口的实例对象,当需求变更后,对Person的改动很小。Person依赖Movable,对Person的改动如下:

Person中的go()方法依赖Movable抽象,在Person内部不确定指明其依赖的具体某种交通工具(如Bike、Bus、Car等),至此可以说,Person这个上层类,已经不直接依赖于底层类了,实现了依赖抽象的设计风格。

Movable是抽象,其代表了一类行为。Bike、Bus、Car是具体的实现细节,它们有自己的个性化部分——Bike需要用脚踩,Bus需要投币,Car需要加油等,但是它们都有一个共性——都可以用作上班时的交通工具。抽象不应该依赖于具体实现,具体实现应该依赖于抽象,即定义交通工具Movable时,不应该依赖于每种具体交通工具的具体功能,反之,每种交通工具(Bike、Car、Bus等具体的实现),应该依赖抽象Movable。如图2-5所示,当用户想要乘坐地铁上班时,按照依赖倒置的软件设计风格,Person类可以轻松地实现扩展。其实依赖倒置是软件工程中面向接口编程的一种具体实现。图2-5 依赖倒置的软件设置风格2.1.3 依赖注入

通过以上小节的分析,软件设计虽然采用依赖倒置的原则,但是,对象所依赖的其他对象,还是需要研发人员手动管理,即Person依赖的Bike、Bus、Car,还是需要开发人员主观创建这些依赖对象。有没有办法实现无须开发人员手动管理依赖关系呢?这就是依赖注入。

依赖注入(DI,Dependency Injection)是Spring实现IoC容器的一种重要手段。依赖注入将对象间的依赖的控制权从开发人员转移到了容器,降低了开发成本。此时,Person不再需要开发人员手动维护其依赖项,而是通过Spring将依赖关系注入Person中。一个简单的依赖注入代码如下:“@Service("bike")”表示将Bike交给IoC容器管理,容器中会存放一个符合单例模式的Bike对象。当Person依赖Bike时,无须开发人员手工维护Person和Bike的依赖关系,IoC容器很好地解决了这个问题,代码如下:

图2-6可以更好地帮助理解依赖注入。开发人员手工管理依赖,类似于顾客主动向服务员要取菜单,“服务员,把菜单给我,我要点餐”。通过依赖注入这种设计方案,顾客无需向服务员索要菜单,服务员将会走到顾客身边,将菜单递给顾客。回到软件开发场景中,通过依赖注入,Person类不再需要创建其依赖的交通工具,当Person需要借助交通工具去上班时,直接使用Movable对象就可以实现,具体是通过何种交通工具上班,开发人员无须再关心。图2-6 依赖倒置示意图

依赖注入减少了开发人员维护大量依赖关系的工作量,提高了开发人员的工作效率。

控制反转、依赖倒置和依赖注入三者之间的关系是:控制反转是一种软件设计模式,其遵循了软件工程中的依赖倒置原则;依赖注入是Spring框架实现控制反转的一种方式。2.2 Spring IoC的实现方式2.2.1 XML方式实现

用构造器方式实现IoC分为无参构造器和有参构造器两种。下面以User和Order为例说明,User使用无参构造器的方式,Order使用有参构造器的方式,分别实现无参构造器和有参构造器的IoC。

User类的实现如下:

在spring-chapter2.xml文件中,通过bean标签将User类交给IoC容器管理,代码如下:

与User类不同的是,Order类是没有无参构造器的,Order类含有一个带有两个参数——订单号和订单金额的有参构造器。Order类的定义如下:

在spring-chapter2.xml文件中通过bean标签将User类交给IoC容器管理。具体配置如下:

在单元测试类XmlTest中,通过依赖注入得到Speakable的对象User和Deliverable的对象Order,单元测试代码如下:

其中@RunWith这个注解指定了让单元测试运行于Spring的环境中,@ContextConfiguration这个注解指定Spring加载的配置文件。执行单元测试,测试结果如下。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载