Spring Boot开发实战(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-10 06:19:07

点击下载

作者:陈光剑

出版社:机械工业出版社

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

Spring Boot开发实战

Spring Boot开发实战试读:

前言

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是简化新Spring应用的初始搭建以及开发过程。在Java开发领域中,有很多著名框架都是Pivotal团队的产品,如:Spring框架及其衍生框架、缓存Redis、消息队列框架RabbitMQ、Greenplum数据库等。还有Tomcat、Apache Http Server、Groovy里的一些顶级开发者、DevOps理论的提出者都属于Pivotal团队。Spring团队在现有Spring框架的基础上,开发了一个新框架:Spring Boot,用来简化配置和部署Spring应用程序的过程,去除了那些烦琐的开发步骤和样板代码及其配置,使得基于Spring框架的Java企业级应用开发“极简化”。相比于传统的Spring/Spring MVC框架的企业级应用开发(Spring的各种配置太复杂了,我们之前是用“生命”在搞这些配置),Spring Boot用简单的注解和application.properties配置文件,避免了烦琐而且容易出错的XML配置文件,极大地简化了基于Spring框架的企业级应用开发的配置。

Kotlin是由JetBrains团队开发的多平台、静态类型、强工程实用性的编程语言,Kotlin 100%兼容Java,比Java更强大、更安全、更简洁、更优雅。Kotlin是Google公司的Android官方支持的开发语言。Spring官方也正式支持Kotlin语言,Spring Boot 2.0版本中为Kotlin提供了一流的支持。其实,在Spring Boot 2.0和Spring 5.0框架源代码中,已经可以看到Kotlin代码。

本书可以说是我对使用Spring Boot+Kotlin进行服务端开发的实战和思考过程的粗浅总结。通过本书的写作,加深了我对Spring Boot框架和Kotlin编程语言的理解,我深刻体会到了学无止境的含义。写书的过程也是我系统学习与思考的过程,如果本书能够对你有所帮助,将不胜欣慰。如何阅读本书

本书系统介绍了使用Spring Boot 2.0框架,并基于Gradle+Kotlin来开发企业级应用。希望通过简练的表述,系统全面地介绍如何使用Spring Boot 2.0框架开发项目,每章的关联度不大,读者可根据自己的需求阅读本书。

全书共分三大部分:

·第Ⅰ部分 Spring Boot框架基础(第1~3章)

·第Ⅱ部分 Spring Boot项目综合实战(第4~17章)

·第Ⅲ部分 Spring Boot系统监控、测试与运维(第18~20章)

建议初学者最好按照章节顺序来阅读本书。如果想直接使用Spring Boot框架进行项目的实战,可以直接进入第Ⅱ部分,如果对Spring Boot应用的监控、测试与运维感兴趣,那么可以从第Ⅲ部分直接开始阅读。

本书共20章,各个章节内容简介如下。

第1章:简单介绍了Spring Boot框架的历史、组成、特性等。

第2章:使用Spring Boot 2.0快速实现一个基于Kotlin和Gradle的HelloWorld应用。

第3章:介绍Spring Boot是怎样通过自动配置实现“极简化配置”的应用开发。

第4章:介绍如何使用Spring Boot集成MyBatis来进行数据库层开发。

第5章:介绍如何使用Spring Boot集成Spring Data JPA来进行数据库层开发。

第6章:介绍如何开发一个Gradle插件,以及如何简化开发过程中样板代码的编写。

第7章:介绍Kotlin编程语言,以及如何集成Spring Boot和Spring MVC进行服务端开发。

第8章:介绍在Spring Boot项目中怎样自定义Web MVC配置。

第9章:介绍基于Spring Boot+Spring MVC,使用AOP+Filter如何实现一个简单的用户登录鉴权与权限控制系统。

第10章:介绍如何使用Spring Boot集成Spring Security开发一个自动化测试平台。

第11章:介绍Spring Boot集成React.js开发前后端分离项目的实战案例。

第12章:介绍如何开发任务调度、邮件服务等系统功能。

第13章:介绍如何用Spring Boot集成WebFlux开发响应式Web应用。

第14章:介绍在Spring Boot项目开发中怎样使用Spring Cache实现数据的缓存。

第15章:介绍如何使用Spring Session集成Redis实现Session共享,从而实现水平扩展。

第16章:介绍如何使用Netflix Zuul实现一个微服务API Gateway来完成简单代理转发和过滤器功能。

第17章:详细介绍Spring Boot应用的日志配置与使用,主要介绍Logback日志框架。

第18章:介绍如何使用Spring Boot Actuator和Spring Boot Admin实现监控与管理。

第19章:介绍Spring Boot应用的测试,以及如何在实际项目中进行分层测试。

第20章:介绍如何使用Docker来构建部署运行Spring Boot应用。谁适合阅读本书

本书适合于所有Java、Kotlin程序员,以及任何对编程感兴趣的朋友。如果你目前还不是程序员,但想进入企业级应用开发的编程世界,那么你也可以尝试从本书开始学习。

虽然书中的部分内容需要一定的Java和Kotlin编程基础,还需要了解Spring框架,但是如果你想快速开始企业级应用开发,不妨从这里开始——Spring Boot 2.0+Kotlin,这种方式的极简特性定能激发你对编程的兴趣。代码下载

每章末尾基本上都附了该章示例工程源代码地址。这些源码都在https://github.com/Easy-SpringBoot。可以根据需要,自由克隆下载学习。致谢

在本书的写作出版过程中,得到了很多人的帮助和陪伴。首先要感谢的是我的妻子和两个可爱的孩子。正是有了你们的陪伴,我的生活才更加有意义。我始终感谢我的父母,虽然你们可能不知道我写的东西是什么,但是因为有了你们的辛勤养育,我才能长成今天的我。我要衷心地感谢吴怡编辑。在本书的写作修改过程中,她耐心细致地对稿件进行了详尽、细致的审阅和批注,还提出了很多宝贵的修改建议。感谢本书出版过程中所有付出辛勤劳动的工作人员。我还要感谢在我的工作学习生活中认识的,所有朋友和同事们,能够认识你们并跟你们一起学习共事,是我的荣幸。请联系我

虽然在本书写作与修改的过程中,我竭尽全力追求简单正确、清晰流畅地表达内容,但是限于自身水平和有限的时间,也许仍有错误与疏漏之处,还望各位读者不吝指正。

关于本书的任何问题、意见或者建议都可以通过邮件universsky@163.com与我交流。

快乐生活,快乐学习,快乐分享,快乐实践出真知。

最后,祝大家阅读愉快!陈光剑2018年4月于杭州第Ⅰ部分Spring Boot框架基础第1章 Spring Boot简介第2章 快速开始HelloWorld第3章 深入理解Spring Boot自动配置第1章Spring Boot简介

认识一个事物最好的方式就是首先去了解它的历史。

Spring框架是由Rod Johnson在2001年开始开发的一个开源框架,主要为了解决企业级应用程序开发的复杂性。Spring提倡“零”侵入设计原则,颠覆了传统的编程模式。Spring引入控制反转(Inversion of Control,IoC)的核心编程思想,控制反转还有一个名字叫作依赖注入(Dependency Injection,DI),就是由容器来管理协同Bean之间的关系,而非传统实现中,由程序代码直接操控。同时,Spring还把面向切面编程(AOP)集成进来,使得AOP的编程范式发扬光大。

Spring从IoC容器发展而来,通过不断集成AOP、MVC、OR/Mapping以及几乎你能想到的各项服务而提供完善的企业应用框架。目前大多数J2EE项目都已经采用Spring框架。

随着Spring功能的不断丰富,版本的不断迭代发展,Spring框架渐渐暴露出了一些问题和弊端。例如太多样板化的配置、烦琐复杂的使用过程等,我们不仅需要维护程序代码,还需要额外去维护相关的配置文件。Spring项目的配置越来越复杂,让人难以承受。大量的XML配置以及复杂的依赖管理使得人们不得不去解决这个问题——Spring Boot由此应运而生。

在本章中,我们先来简单了解一下Spring Boot框架的历史、组成、特性等。1.1 从Spring到Spring Boot

本节将介绍Spring Boot的产生背景。我们先来回顾一下Spring框架的前世今生。1.1.1 从EJB到Spring

EJB(Enterprise Java Bean)最初的设计思想是为分布式应用服务的。分布式是针对大型应用构造的跨平台的协作计算,EJB最初的目的就是为这种计算服务的。使用EJB技术的系统整体架构如图1-1所示。图1-1 使用EJB技术的系统架构图

EJB的基础是RMI(Remote Method Invocation,远程方法调用),RMI利用Java对象序列化的机制实现分布式计算,实现远程类对象的实例化以及调用。通过RMI,J2EE将EJB组件创建为远程对象。RMI将各种任务与功能的类放到不同的服务器上,然后通过各个服务器间建立的调用规则实现分布式的运算。通过RMI的通信(底层仍然是Socket),连接不同功能模块的服务器,以实现一个完整的功能。

EJB规范定义了EJB组件在何时如何与它们的容器进行交互作用,容器负责提供公用的服务,例如目录服务、事务管理、安全性、资源缓冲池以及容错性。但这里值得注意的是,EJB并不是实现J2EE的唯一途径。但是软件发展到目前为止,大多数应用不需要采用这么重的解决方案,因此用EJB显得太臃肿了。提示 更多关于J2EE的内容,可以参考:https://github.com/javaee。

对于中小型的应用项目而言,基本不采用分布式的解决方案,那么为什么要采取一个为分布式设计的方案来解决非分布式的问题呢?Spring就是为了解决这个问题而诞生的。

Spring的目的是为了解决企业应用开发的复杂性,它的主要功能是使用基本的Java Bean代替EJB,并提供了更多的企业应用功能。Spring使得已存在的技术更加易用。简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。Spring也提供了很多基础功能(事务管理、持久化框架集成等)。Spring的设计原则是“非侵入性”的,我们在实际业务逻辑代码中几乎感觉不到Spring框架的存在。

Spring框架的核心功能简单概括为:解耦依赖(DI)、系统模块化(AOP)。Spring“不重复发明轮子”,而是去集成业内已有的优秀解决方案。

Spring容器以Bean的方式来组织和管理Java应用中的各个组件及其组件之间的关系。基于Java Beans的配置管理,特别是对依赖注入(DI)技术的使用,减少了各组件间对业务逻辑具体实现的相互依赖性。

Spring使用BeanFactory来产生和管理Bean,它是工厂模式的实现。BeanFactory使用控制反转模式将应用的配置和依赖性规范与实际的应用程序代码分开。BeanFactory使用依赖注入的方式给组件提供依赖。

Spring框架主要用于与其他技术(例如Struts,Hibernate,MyBatis等)进行整合,将应用程序中的Bean组件实现低耦合关联,提高了系统的可扩展性和维护性。

Spring集成的AOP框架提供了诸如数据库声明式事务等服务。通过使用Spring AOP,我们无须依赖EJB组件,就可以将声明式事务管理集成到应用程序中。AOP的目的是提高系统的模块化程度。

当然,作为一个完整的J2EE框架,Spring生态中也给出了完整的分布式系统架构的解决方案,那就是Spring Boot+Spring Cloud,这个解决方案中包含了服务发现(Service Discovery)、断路器(Circuit Breaker)、OAuth2(实现SSO、登录token的管理)、服务配置(Configuration Server)、消费者驱动契约(Consumer-Driven Contracts)、API Gateway等。

Spring的微服务系统架构如图1-2所示。1.1.2 Spring框架发展简史

Spring框架首次在2003年6月的Apache2.0使用许可中发布。第一个具有里程碑意义的版本是2004年3月发布的1.0。

下面是Spring框架的发展简史:

·2003年,Spring0.9发布。2003年11月,Ben Alex将Acegi Security的代码贡献给Rod和Juergen,2006年5月发布Acegi Security。

·2006年6月发布Spring Webflow 1.0。2006年8月发布Spring LDAP。2006年10月发布Spring 2.0。

·2007年5月发布Spring Batch。2007年11月发布Spring 2.5。Spring 2.5是Spring 2.1各个里程碑版本的终结。

·2011年6月发布Spring Data JPA 1.0。2011年12月发布Spring 3.1

·2014年4月发布Spring Boot 1.0。2014年12月发布Spring 4.1.3

·2015年7月发布Spring 4.2

·2016年6月发布Spring 4.3

·2017年9月发布Spring 5.0。2017年11月发布Spring Boot v2.0.0.M7

·2018年3月1日发布Spring Boot v2.0.0.Release;2018年4月5日发布Spring Boot 2.0.1.Release版本,是目前最新版本。图1-2 Spring的微服务系统架构图提示 详细的发布日志参考https://github.com/spring-projects/spring-boot/releases。1.1.3 Spring框架的核心模块

Spring框架如图1-3所示。组成Spring框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。下面我们分别介绍。1.核心容器模块

核心容器提供Spring框架的基本功能,包括Core、Beans、Context、EL模块。图1-3 Spring架构图

Core模块封装了框架依赖的最底层部分,包括资源访问、类型转换及一些常用工具类。Beans模块中的主要组件是BeanFactory,它是工厂模式的实现。Context模块是一个配置文件,向Spring框架提供上下文信息。EL模块提供强大的表达式语言支持。2.AOP、Aspects模块

AOP模块提供了符合AOP Alliance规范的面向切面的编程实现,提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,并且能动态地把这些功能添加到需要的代码中;这样各专其职,可降低业务逻辑和通用功能的耦合。Aspects模提供了对AspectJ的集成,AspectJ提供了比Spring ASP更强大的功能。3.数据访问/集成模块

该模块包括JDBC、ORM、OXM、JMS和事务模块(Transactions)。

事务模块用于Spring管理事务,只要是Spring管理对象都能得到Spring管理事务的好处,无须在代码中进行事务控制了,而且支持编程和声明性的事务管理。

JDBC模块提供了一个JBDC的样例模板,使用这些模板能消除传统冗长的JDBC编码还有必须的事务控制,而且能享受到Spring管理事务的好处。

ORM模块提供与流行的“对象-关系映射”ORM框架的无缝集成,包括Hibernate、JPA、MyBatis等。

OXM模块提供了一个对Object/XML映射实现,将Java对象映射成XML数据,或者将XML数据映射成Java对象,Object/XML映射实现包括JAXB、Castor、XMLBeans和XStream。

JMS(Java Messaging Service)模块提供一套“消息生产者、消息消费者”模板以便更加简单地使用JMS,JMS用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。4.Web/Remoting模块

Web/Remoting模块包含Web、Web-Servlet、Web-Struts、Web-Porlet模块。

Web模块提供了基础的Web功能。例如多文件上传、集成IoC容器、远程过程访问(RMI、Hessian、Burlap)以及Web Service支持,并提供一个RestTemplate类来提供方便的Restful services访问。

Web Servlet模块提供了一个Spring MVC Web框架实现。

Web Struts模块提供了与Struts无缝集成,Struts1.x和Struts2.x都支持。5.Test模块

Test模块支持Junit和TestNG测试框架,而且还额外提供了一些基于Spring的测试功能,比如在测试Web框架时,模拟Http请求的功能。

当下Spring生态中,Spring Boot、Spring Cloud和Data Flow三驾马车带领使用Spring进行应用开发勇往直前,如图所示:

使用Spring Boot构建一切服务。Spring Boot旨在让你尽可能快地启动和运行,并极简化Spring配置。

使用Spring Cloud协调一切服务。Spring Cloud使得实现分布式的、微服务风格的架构更加简单。

使用Spring Cloud Data Flow连接一切服务。Data Flow将企业服务连接到任何移动设备、传感器、可穿戴设备、汽车等的互联网上。Spring Cloud数据流提供了一个统一的服务,用于创建地址流和基于ETL的数据处理模式、可组合的数据微服务。1.2 Spring Boot简介

在本节中,我们从整体上简要介绍一下Spring Boot框架。1.2.1 Spring Boot是什么

Java Web开发涉及的技术比较繁杂,有很多开发框架和工具(Java、Scala、Kotlin、Clojure、Groovy、Grails、Gradle、Maven、JDBC、MySQL、Oracle、MongoDB、Tomcat、Jetty、Spring、Struts、Hibernate、MyBatis、JPA、JSP、Velocity、FreeMarker、Thymeleaf、Redis等),而且它们各有所长,并不是一个完整的体系。这提高了程序员进行Jave Web开发的技术门槛和学习成本。

有没有一个像“航空母舰”式的威力强大的武器,可以整合这一切呢?答案就是:Spring Boot。

Spring Boot由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。Spring Boot是伴随着Spring 4.0诞生的。从字面理解,Boot是引导的意思,因此Spring Boot极大地帮助了开发者快速搭建使用Spring框架开发应用程序的过程。例如,Spring Boot可以直接快速启动一个内嵌的Web容器,而无须单独安装和配置Web服务器。

Spring Boot框架遵循“约定优于配置”的思想。清除了原先使用Spring框架的那些样板化的配置。Spring Boot继承了原有Spring框架的优秀基因;Spring Boot使得基于Spring的开发过程更加简易。Spring Boot致力于帮助开发人员快速开发应用。

多年以来,Spring IO平台饱受非议的一点就是大量的XML配置以及复杂的依赖管理。Spring Boot实现了“零XML配置”的极简开发体验。

然而,Spring Boot并不是要成为Spring IO平台里面众多“Foundation”层项目的替代者。Spring Boot的目标是为平台带来另一种开发体验,从而简化对这些已有技术的使用。对于已经熟悉Spring生态系统的开发人员来说,Boot是一个很理想的选择;对于采用Spring技术的新人来说,Boot提供了一种极简的方式来使用这些技术。

作为当前主流的企业框架Spring,它提供了一整套相关的顶级项目,能让开发者快速上手实现自己的应用。Spring Boot在整个Spring生态中的位置如图1-4所示。图1-4 Spring Boot在整个Spring生态中的位置

Spring Boot是构建基于Spring的应用程序的起点。Spring Boot旨在让你尽可能快地启动和运行,并以最小的预先配置的Spring配置。使用Spring Boot我们可以体验到下面的这些(但不仅限于)特性:

·使用Spring Initializr在数秒内创建Spring应用程序。

·构建任何东西——REST API、WebSocket、Web、流媒体、任务等。

·简化了安全(Security)权限的开发。

·丰富的SQL和NoSQL支持。

·嵌入式运行时支持——Tomcat、Jetty和Undertow。

·开发人员的生产力工具,例如实时重载(reload)和自动重启(restart)。

·开箱即用的模块化依赖。

·供生产环境直接使用的特性,如跟踪、度量和健康状态的监控。

·丰富的IDE支持:Spring Tool Suite、IntelliJ IDEA和NetBeans。

Spring Boot的核心特性如下:

·创建一键运行的Spring应用。

·能够使用内嵌的Tomcat、Jetty或Undertow,不需要部署war。

·提供定制化的启动器starters简化第三方依赖配置。

·追求极致的自动配置Spring。

·提供一些生产环境的特性,比如特征指标、健康检查和外部配置。

·零代码生成和零XML配置

Java EE原来开发应用的步骤是:

·应用打成war包。

·启动应用服务器。

·在应用服务器中进行部署。

微服务时代,从部署到服务器中改造为直接启动应用进程,内嵌一个Web容器。把所需要的jar和应用代码全部打包到一个jar或者war中。如果打成可执行jar包,我们可以直接通过java-jar example.war的方式来启动服务。

嵌入式Tomcat早就存在,Spring Boot支持内嵌Tomcat、Jetty和Undertow等Web服务器。测试表明Undertow比Tomcat性能更好。类似于Wildfly-swarm等微服务框架,Spring Boot拥有相似的架构和开发/构建方法。例如,Wildfly-swarm和Spring Boot的基础组件对比见表1-1。表1-1 Spring Boot和Wildfly-swarm基础组件对比1.2.2 Spring Boot核心模块

Spring Boot核心模块如图1-5所示。图1-5 Spring Boot核心模块

下面我们简要介绍一下Spring Boot的核心模块。1.spring-boot

Spring Boot核心工程。2.starters

是Spring Boot的启动服务工程。spring-boot中内置提供的starter列表可以在Spring Boot项目源代码工程spring-boot/spring-boot-starters中看到。这些starters的使用例子,在源码中的spring-boot/spring-boot-samples工程中。3.autoconfigure

是Spring Boot实现自动配置的核心工程。4.actuator

提供Spring Boot应用的外围支撑性功能。比如:应用状态监控管理、应用健康指示表、远程shell支持、metrics支持等。5.tools

提供了Spring Boot开发者的常用工具集。诸如,spring-boot-gradle-plugin、spring-boot-maven-plugin就在这个模块里面。6.cli

是Spring Boot命令行交互工具,可用于使用Spring进行快速原型搭建。可以用它直接运行Groovy脚本。如果你不喜欢Maven或Gradle,可用CLI(Command Line Interface)来开发运行Spring应用程序。可以使用它来运行Groovy脚本,甚至编写自定义命令。1.3 约定优于配置极简化理念

Spring Boot充分利用了JavaConfig的配置模式以及“约定优于配置”(Convention Over Configuration,COC)的理念,极大地简化了基于Spring MVC的Web应用和REST服务的开发。

不用看那一堆带着无数尖括号的XML真的让人很神清气爽。用JavaConfig注解方式可以让人很容易明白配置代码中的关键信息。

例如,一个标准的基于Gradle构建的Spring Boot应用程序目录结构约定如下:.├── LICENSE├── README.md├── build.gradle├── gradle│ └── wrapper│ ├── gradle-wrapper.jar│ └── gradle-wrapper.properties├── gradlew├── gradlew.bat└── src ├── main │ ├── java │ ├── kotlin │ │ └── com │ │ └── easy │ │ └── Spring Boot │ │ └── demo2_aop_logging │ │ ├── Demo2AopLoggingApplication.kt │ │ ├── aop │ │ │ └── LogAspect.kt │ │ └── controller │ │ └── HelloAopController.kt │ └── resources │ ├── application-daily.properties │ ├── application-dev.properties │ ├── application-prod.properties │ ├── application.properties │ ├── static │ └── templates └── test ├── java ├── kotlin │ └── com │ └── easy │ └── Spring Boot │ └── demo2_aop_logging │ └── Demo2AopLoggingApplicationTests.kt └── resources23 directories, 20 files

目录文件简单说明如下:

·build.gradle——Gradle工程项目配置文件。

·src/main/java——项目Java源代码目录。

·src/main/kotlin——项目Kotlin源代码目录。

·src/main/resources——项目资源文件目录。

·src/test/java——测试Java源代码目录。

·src/test/kotlin——测试Kotlin源代码目录。

·src/test/resources——测试资源文件目录。

许多框架使用了COC的思想,包括:Spring、Ruby on Rails、Kohana PHP、Grails、Grok、Zend Framework、CakePHP、Symfony、Maven、ASP.NET MVC、Web2py(MVC)、1Apache Wicket等。COC是一个古老的思想理念,甚至在Java类库中也可以找出这一概念的踪迹。JavaBean规范中很多就是依赖这个理念。

例如,在知名的Java对象关系映射(ORM)框架Hibernate的早期版本中,将类及其属性映射到数据库上在XML文件中进行配置,而其中大部分信息都应能够按照约定得到,如将类映射到对应的数据库表,将类属性一一映射到表上的字段。在后续的版本中抛弃了这样的XML配置文件,而是采用Java类属性使用驼峰式命名对应数据库表中的下划线命名这个恰当的约定,大大简化了配置。而对于不符合这些约定的特殊情形,就使用Java注解来标注说明。

例如,Spring通过使用约定好的注解来标注Spring应用中各层中的Bean类:

·@Component——标注一个普通的Spring Bean类。

·@Controller——标注一个控制器组件类。

·@Service——标注一个业务逻辑组件类。

·@Repository——标注一个DAO组件类。

其实Java的成功,Spring的成功,XML的成功,Maven的成功等,都有其必然性,因为它们的设计理念都包含一个很简单但很深刻的道理——那就是“通用”。为什么通用?因为遵循约定。提示 约定优于配置(Convention Over Configuration,COC)也称为按约定编程,是一种软件设计范式,旨在减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性。1.4 本章小结

Spring Boot是一个名词,反过来念就是“Boot Spring”,是一个动宾结构的词语,意即:“起飞吧,Spring!”。这正是Spring Boot框架设计的初心所在。自始至终,Spring都在努力使开发者能够“极简”“快速”地创建并开发应用。第2章快速开始HelloWorld

在本章中,我们使用Spring Boot2.0快速实现一个基于Kotlin和Gradle的HelloWorld应用。下面我们直接开始吧。2.1 创建Spring Boot项目

本节我们使用IDEA集成开发环境来快速创建实现一个Spring Boot版本的Hello World项目。

基本的JDK运行环境、Gradle环境配置就不在这里赘述。如果是初次进入Java企业级应用的开发者,可以先把基本的开发环境配置好。

首先打开IDEA,依次点击File→New→Project,然后,我们进入New Project界面,如图2-1所示。

选择Spring Initializr,Project SDK设置为JDK1.8,采用Spring官方的Initializr服务URL https://start.spring.io/点击Next进入Project Metadata设置界面,如图2-2所示。如图中设置项目元数据。其中:

·Type:选择Gradle Project表示我们创建的是一个基于Gradle构建的项目。

·Language:选择Kotlin表示我们采用Kotlin编程语言。

·Packag:表示项目的主包路径是com.easy.Spring Boot.demo0_hello_world。

点击Next进入Spring Initializr初始化项目界面,如图2-3所示。

选择Spring Boot版本为2.0.0.M7,选择“Web”启动器依赖(即Full-stack web development with Tomcat and Spring MVC)。点击Next进入项目名称、存放路径等信息的配置,如图2-4所示。图2-1 New Project界面图2-2 Project Metadata设置界面图2-3 Spring Initializr初始化项目界面图2-4 项目名称、存放路径等信息的配置

点击Finish会弹出创建目录的对话框,如图2-5所示。直接点击OK,IDEA将会为我们完成剩下的一切:创建项目标准目录,下载Gradle项目依赖等。当完成项目的初始化创建后,IDEA会自动导入该项目,如图2-6所示。图2-5 创建目录的对话框图2-6 导入项目

我们按照图中选项选择Gradle项目的配置,注意,这里使用的是local gradle distribution,这样会比较快。点击OK,等待IDEA初始化项目完毕,我们将得到一个样板工程。2.2 Spring Boot项目的入口类

在样板工程中,Demo0HelloWorldApplication是Spring Boot项目的入口类,它的关键源代码如下:@Spring BootApplicationclass Demo0HelloWorldApplicationfun main(args: Array) { runApplication(*args)}

其中,org.springframework.boot.runApplication是Spring Boot2.0中针对Kotlin扩展的功能类SpringApplicationExtensions.kt中提供的内联函数。关键代码如下:inline fun runApplication(vararg args: String): Configurable ApplicationContext = SpringApplication.run(T::class.java, *args)

我们在main函数里面打印一行日志:fun main(args: Array) { println("Spring Boot 2.0极简教程") runApplication(*args)}

点击IDEA的运行按钮,如图2-7所示。图2-7 运行按钮

我们可以看到后台日志中打印出了我们代码中的内容,如图2-8所示。图2-8 后台日志打印内容2.3 添加HelloWorldController

接着上节的工程,在目标package上单击,按下快捷键Command+N创建Kotlin Class,如图2-9所示。图2-9 按下快捷键Command+N创建Kotlin Class

输入类名,如图2-10所示。图2-10 输入类名

实现代码如下:@RestControllerclass HelloWorldController { @GetMapping(value = ["", "/", "/hello"]) // 匹配请求的 URL列表:"", "/", "/hello" fun hello(): Greeting { return Greeting(name = "World", greeting = "Hello") } data class Greeting(var name: String, var greeting: String)}

其中,data class Greeting是Kotlin中的数据类。提示 关于Kotlin编程语言的相关内容你可以参考《Kotlin极简教程》(机械工业出版社,2017年9月出版)。

启动应用,在浏览器中打开http://127.0.0.1:8080,可以看到输出结果,如图2-11所示。图2-11 浏览器中的输出结果

到这里,我们已经完成了一个RESTful Web HTTP Service。提示 本节示例工程源代码位于https://github.com/KotlinSpringBoot/demo0_hello_world。

下面我们重点讲解一下示例工程中用到的几个核心注解。2.4 Spring Boot应用注解@Spring BootApplication

我们在上面看到在Spring Boot入口类上面添加了注解@Spring BootApplication,这个注解的定义如下:@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@Spring BootConfiguration@EnableAutoConfiguration@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExclu deFilter.class) })public @interface Spring BootApplication {...}

@Spring BootApplication注解实际上封装了以下三个注解:

·@Spring BootConfiguration:配置类注解。

·@EnableAutoConfiguration:启用自动配置注解。

·@ComponentScan:组件扫描注解。

下面我们分别来介绍。2.4.1 Spring Boot配置类注解

@SpringBootConfiguration与@Component注解是一样的。@SpringBootConfiguration其实是Spring Boot包装的@Configuration注解:@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Configurationpublic @interface Spring BootConfiguration {}

而@Configuration注解使用的又是@Component注解:@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface Configuration { @AliasFor(annotation = Component.class) String value() default "";}

我们知道,@Component注解的功能是把普通POJO实例化到Spring容器中,相当于配置文件中的

在类上添加注解@Configuration,表明这个类代表一个Spring配置文件,与原来XML配置是等效的。只不过现在用Java类加上一个@Configuration注解进行配置了,这种方式与XML相比可以称得上是极简风格了。同时基于注解的配置风格,使得代码的可读性也大大增高了。

Spring容器可以扫描出任何我们添加了@Component注解的类,Bean的注册逻辑在Class-PathScanningCandidateComponentProvider这个类的registerDefaultFilters方法里。提示 注解(Annotation)是JDK1.5中引入的一个新特性。从Spring2.0以后的版本中,Spring引入了基于注解方式的配置,用于取代XML配置文件,从而极简化了Bean的配置,Spring后来的新版本。在Spring Boot中完全采用基于注解(Spring4.x引入了更加智能的@Condition系列注解,我们将会在后面的章节中详细介绍)的配置,实现“零XML的配置”(当然,同时也支持之前的XML配置文件方式)。2.4.2 启用自动配置注解

@EnableAutoConfiguration这个注解是Spring Boot的最核心注解。首先我们看它的定义:@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@AutoConfigurationPackage@Import(AutoConfigurationImportSelector.class)public @interface EnableAutoConfiguration {...}

其中,导入配置类注解@Import标识导入@Configuration标注的配置类。@Import用来整合所有在@Configuration注解中定义的Bean配置。这与我们将多个XML配置文件导入到单个文件的场景一致。@Import注解实现了相同的功能。

使用@EnableAutoConfiguration注解可以启用Spring应用程序上下文的自动配置,Spring Boot会去尝试猜测和配置你可能需要的Bean。自动配置类通常是根据类路径中你定义的Bean来推断可能需要怎样的配置。

例如,如果在你的类路径中有tomcat-embedded.jar这个类库,那么Spring Boot会根据此信息来判断你可能需要一个TomcatServletWebServerFactory(除非你已经定义了你自己的ServletWebServerFactory Bean)。当然我们还可以通过设置exclude或者excludeName变量的值来手动排除你不想要的自动配置。

Spring Boot默认扫描的包路径是入口类Demo0HelloWorldApplication所在的根包中,及其所有的子包。通常,Spring Boot自动配置Bean是根据Conditional Bean(条件Bean)中注解的类信息来推断的。例如@ConditionalOnClass、@ConditionalOnMissingBean注解。关于Spring Boot自动配置的相关内容我们将在后面的章节中详细介绍。2.4.3 组件扫描注解

组件扫描注解@ComponentScan提供的功能与Spring XML配置文件中的元素等价。对应@ComponentScan注解的处理类是ConfigurationClassParser。@ComponentScan告诉Spring去哪个package下面扫描Spring注解。Spring会去自动扫描这些被Spring注解标注的类,并且将其注册到Bean容器中。例如下面的XML配置:

对应到Java Config风格如下:@Configuration@ComponentScan(basePackages = "com.easy.SpringBoot", nameGenerator = MyApp.class)public class AppConfig { ...}

如果你有个类用@Controller注解标识了,但是没有加上@ComponentScan告诉Spring去扫描这个类所在的包,那么该Controller就不会被注册到Spring容器中。

不过,Spring Boot中如果不显式地使用@ComponentScan指明对象扫描的包,那么默认只扫描当前启动类所在的包里的类。

我们可以设置basePackageClasses的值来指定要扫描哪个类所在的包,代码示例如下:@Spring BootApplication@ComponentScan(basePackageClasses=MyApplication.class) //指定扫描MyApplication //类所在的包public class MyApplication { public static void main(String[] args){ SpringApplication.run(MyApplication.class, args); }}2.5 XML配置与注解配置

本节简单对比一下传统的Spring XML配置与基于JavaConfig的注解配置Bean的两种方式。

Spring对于Bean的配置有两种方式:XML配置,注解配置。1.XML配置

优点:可以在后期维护的时候适当地调整Bean管理模式,并且只要遵循一定的命名规范,可以让程序员不必关心Bean之间的依赖关系。

缺点:系统越庞大,XML配置文件就越大;关系错综复杂,容易导致错误。2.注解配置

优点:配置比较方便,程序员只要在service层代码设置即可实现,不需要知道系统需要多少个Bean,交给容器来注入就好了。

缺点:当你要修改或删除一个Bean的时候,你无法确定到底有多少个其他的Bean依赖于这个Bean。(解决方法:需要有严格的开发文档,在修改实现时尽可能继续遵守相应的接口规则,避免使其他依赖于此的Bean不可用。)2.6 本章小结

Spring Boot可以说是Spring践行“约定优于配置”(Convention Over Configuration)理念的极佳范例。“Spring Boot无它,唯Spring”是也。第3章深入理解Spring Boot自动配置

Spring框架提供了以多种方式配置Bean的灵活性,如XML、注释和JavaConfig。随着特性的增加,复杂性也增加了,而配置Spring应用程序变得单调乏味且容易出错。Spring团队于是创建了Spring Boot以解决配置的复杂性。本章先来快速回顾一下使用Spring框架开发的复杂性,看看Spring Boot试图解决的问题是什么,然后介绍Spring Boot自动配置原理,以及实测分析。3.1 传统的SSM开发过程

传统的SSM(Spring+SpringMVC+MyBatis),曾经是主流的企业级架构方案:标准的MVC分层架构设计模式,将整个系统划分为模板视图(View)层、控制器(Controller)层、业务逻辑Service层、数据库访问的Dao层。我们使用Spring MVC负责请求的转发和视图管理,使用Spring核心容器实现业务对象的协作和生命周期的管理,MyBatis作为数据库ORM层的对象持久化引擎。

我们需要小心翼翼地配置pom.xml中的各种项目依赖及其版本以保证jar包不冲突。这个pom.xml将是一个很庞大的依赖配置,动辄上百行。这么多的依赖,各种版本号也都必须要对得上,不能发生版本不兼容的情况。然后,我们还需要仔细配置Spring上下文spring.xml文件。这个Spring配置文件是Spring的BeanFactory工厂进行Bean生产、依赖关系注入(装配)及Bean实例分发的“图纸总纲”。Java EE程序员必须学会并灵活应用这份“图纸”来准确地表达自己的“生产意图”。

Spring配置文件是一个或多个标准的XML文档,如果在web.xml中没有显式指定contextConfigLocation,将会使用XmlWebApplicationContext的默认的配置/WEB-INF/app-licationContext.xml。applicationContext.xml是Spring的默认配置文件,当容器启动时找不到指定的配置文档时,将会尝试加载这个默认的配置文件。

如果我们使用自定义名称的spring.xml文件,就需要在web.xml中通过配置contex-ConfigLocation参数来指定Spring的配置文件。代码示例如下: contextConfigLocation classpath:spring.xml

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

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载