第1章 Spring Boot入门
1.1 Spring Boot概述
Spring Boot是由Pivotal团队提供的基于Spring的全新框架,旨在简化Spring应用的初始搭建和开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。Spring官网给的定义是:Spring Boot是所有基于Spring开发项目的起点。
Spring Boot集成了绝大部分目前流行的开发框架,就像Maven集成了所有的JAR包一样,Spring Boot集成了几乎所有的框架,使得开发者能快速搭建Spring项目。
Spring Boot的核心设计思想是“约定优于配置”。基于这一设计原则,Spring Boot极大地简化了项目和框架的配置。比如在使用Spring开发Web项目时,我们需要配置web.xml、Spring和MyBatis等,还需要将它们集成在一起。而使用Spring Boot一切将变得极其简单,它采用了大量的默认配置来简化这些文件的配置过程,只需引入对应的Starters(启动器)。
Spring Boot可以构建一切。设计它就是为了使用最少的配置,以最快的速度来启动和运行Spring项目。
1.1.1 Spring Boot的背景
多年来,随着Spring的飞速发展,新功能不断增加,Spring变得越来越复杂。通过访问Spring官网就可以看到Spring的所有子项目和组件框架,如此多的子项目和组件使得Spring逐渐笨重起来,这显然已经无法适应云计算和微服务时代的发展趋势。
于是Spring Boot应运而生。Spring Boot建立在Spring基础之上,遵循“约定优于配置”的原则,避免了创建项目或框架时必须做的繁杂配置,帮助开发者以最少的工作量,更加简单、方便地使用现有Spring中的所有功能组件。
1.1.2 Spring Boot的特性
Spring Boot的一系列特性使得微服务架构的落地变得非常容易,对于目前众多的技术栈,Spring Boot是Java领域微服务架构的最优落地技术。图1-1所示为Spring Boot的一些特性。
1.1.3 Spring Boot的核心组件
Spring Boot官方提供了很多当前流行的基础功能组件的封装,命名一般以spring-boot-starter 英 [ˈstɑːtə®] 美 [ˈstɑːrtər] 开头,比如spring-boot-starter-quartz 英 [kwɔːts] 美 [kwɔːrts] 定时任务组件和spring-boot-starter-thymeleaf 英 [taɪm liːf] 美 [taɪm liːf] 页面模板引擎等。另外,由于Spring Boot的流行,很多第三方中间件也按照Spring Boot的规范提供了针对Spring Boot项目的Starters(启动器),一般以组件名开头,比如MyBatis针对Spring Boot提供的组件包mybatis-spring-boot-starter。Spring Boot的核心组件如图1-2所示。
1.2 Spring Boot的优点
Spring Boot继承了Spring一贯的优点和特性,同时增加了一些新功能和新特性,这让Spring Boot非常容易上手,也让编程变得更加简单。总结起来Spring Boot有如下几个优点:
1)遵循“约定优于配置”的原则,使用Spring Boot只需要很少的配置或使用默认的配置。
2)使用JavaConfig,避免使用XML的烦琐。
3)提供Starters(启动器),简化Maven配置,避免依赖冲突。
4)提供内嵌Servlet容器,可选择内嵌Tomcat、Jetty等容器,不需要单独的Web服务器。这意味着不再需要启动Tomcat或其他任何中间件。
5)提供了一系列项目中常见的非功能特性,如安全监控、应用监控、健康检测等。
6)与云计算、微服务的天然集成。
从软件发展的角度来讲,越简单的开发模式越流行,越有活力,其可以让开发者将精力集中在业务逻辑本身,提高软件开发效率。Spring Boot就是尽可能地简化应用开发的门槛,让应用开发、测试、部署变得更加简单。
1.3 为什么学习Spring Boot
最近几年,Spring生态圈最流行的技术框架莫过于Spring Boot和Spring Cloud。目前,各个企业都在推动微服务技术架构的落地,将一个复杂的应用拆分成多个小的独立模块,分开部署,互不干扰,从而达到松散耦合、提高开发效率和降低运维成本的目的。
Spring Boot作为微服务框架的基础被越来越多地应用于企业级开发中,它是Spring Cloud的基础。要学习Spring Cloud,就必须了解Spring Boot框架的架构和设计理念。
Spring Boot是Spring生态下的一个子项目,用于快速、敏捷地开发新一代基于Spring框架的应用程序。同时,它将目前各种比较成熟的服务框架和第三方组件组合起来(如Redis、MongoDB、JPA、RabbitMQ、Quartz等),按照“约定优于配置”的设计思想封装成Starters组件。这样,我们在Spring Boot应用中几乎可以零配置地使用这些组件,达到开箱即用的效果,从而从繁杂的配置中解放出来,更加专注于业务逻辑的开发。
Spring Boot的优点可以概括为以下几个方面:
- 快速构建:使用Spring Initializr 英 [ɪ’nɪʃəlaɪzə] 美 [ɪ’nɪʃəlaɪzə] 可以快速创建项目,同时提供了丰富的解决方案,便于快速集成各种解决方案,提升开发效率。
- 简化依赖:提供丰富的Starters,简化Maven配置,避免版本兼容问题。
- 一键部署:内嵌Servlet容器,如Tomcat、Jetty 英 ['dʒeti] 美 ['dʒeti] ,能够直接打包成可执行JAR文件独立运行,支持Jenkins 英 [ˈdʒɛŋkɪnz] 美 [ˈdʒɛŋkənz]、Docker,轻松实现自动化运维。
- 应用监控:自带Actuator 英 [ˈæktjʊeɪtə] 美 [ˈæktjuˌeɪtər] 监控组件,轻松监控服务的各项状态。使用Spring Boot Admin可以轻松部署功能完善的应用监控系统。
总的来说,Spring Boot让构建、编码、配置、部署、监控都变得非常简单。Spring Boot可以说是近年来Spring社区乃至整个Java社区非常有影响力的项目之一。
初次学习Spring Boot的程序员,千万不要把它想得太复杂。Spring Boot不是新的语言、新的技术,它只是把现有的比较流行的框架集成在一起,遵循“约定优于配置”的原则,开箱即用,使得我们不需要再去关注那些烦琐的配置。有了这个概念之后,就可以带着轻松的心情去学习Spring Boot。
1.4 约定优于配置极简化理念
我们知道Spring Boot的核心设计思想是“约定优于配置”,Spring Boot提供的所有Starters都是遵循这一思想实现的。那么,究竟什么是“约定优于配置”呢?
“约定优于配置”也被称作“按约定编程”,是一种软件设计范式,旨在减少软件开发者需要的配置项,这样既能使软件保持简单而又不失灵活性。
从本质上来说,系统、类库或框架应该约定合理的默认值,开发者仅需规定应用中不符合约定的部分。例如,如果模型中有一个名为Product的类,那么数据库中对应的表就会默认命名为product,只有在偏离这个约定时才需要定义有关这个名字的配置,例如将该表命名为product_info。
简单来说“约定优于配置”就是遵循约定。如果你所用工具的约定配置符合你的要求,那么就可以省去此配置;不符合,就通过修改相关的配置来达到你所期待的方式。
“约定优于配置”不是新的概念,许多框架使用了“约定优于配置”的设计范式,包括Maven、Spring、Grails、Grok、Apache Wicket等。
Spring Boot是Spring对“约定优于配置”的最佳实践产物。小到配置文件、中间件的默认配置,大到内置容器、Spring生态中的各种Starters,无不遵循“约定优于配置”的设计思想。正是因为简化的配置和众多的Starters,才让Spring Boot变得简单、易用、容易上手,也正是“约定优于配置”的设计思想的彻底落地,才让Spring Boot走向辉煌。
1.5 从Spring到Spring Boot
随着Spring、Spring Boot的不断发展,越来越多的开发者加入Spring的大军中。对于初学者而言,可能不太了解Spring和Spring Boot这些概念以及它们之间的关系,下面我们一起来捋一捋它们之间的关系。
Spring是一个开源生态体系,是集大成者。其核心是控制反转(Inversion of Control,IoC)和面向切面编程(Aspect Oriented Programming,AOP)。正是IoC和AOP这两个核心功能成就了强大的Spring,Spring在这两大核心功能上不断地发展壮大,才有了Spring MVC等一系列成熟的产品,最终构建了功能强大的Spring生态帝国。
Spring Boot是在Spring的基础上发展而来的,它不是为了取代Spring,而是为了简化Spring应用的创建、运行、调试、部署,让开发者更容易地使用Spring。它将目前各种比较成熟的服务框架和第三方组件组合起来,按照“约定优于配置”的设计思想进行重新封装,屏蔽掉复杂的配置和实现,最终给开发者提供一套简单、易用、易部署、易维护的分布式系统开发工具包。
Sptring和Spring Boot之间的关系如图1-3所示。
1.6 开发环境的安装和配置
1.6.1 JDK的安装和配置
由于Spring Boot 2.x版本要求Java 8作为最低语言版本,因此需要安装JDK 8或者以上版本运行。而目前大部分公司或者Java开发人员都在使用Java 8,因此笔者选择JDK 8进行安装和配置。
1.6.1.1 下载JDK安装包
JDK的安装包可以在Oracle官网免费下载。在下载之前,需要确定所使用电脑的系统信息,这里以Windows系统为例。首先在电脑桌面上用鼠标右键点击“计算机”或“此电脑”,然后点开属性面板,之后可以在“属性”栏中查看“系统属性”。如果是64位操作系统,则需要下载对应的64位JDK安装包;如果是32位操作系统,则需要下载对应的32位JDK安装包。
打开浏览器,在Oracle官网找到对应的JDK下载页面。
如果还没有Oracle官网的账号,则需要注册一个账号,否则无法在Oracle官网下载JDK安装包,注册页面如图1-4所示。
下载地址:https://www.oracle.com/java/technologies/downloads/#java8-windows
1.6.1.2 安装JDK
在JDK安装包下载完成后,首先鼠标左键双击“jdk-8u311-windows-x64.exe”文件进行安装,然后会出现JDK安装界面,如图1-6所示。
1.6.1.3 配置环境变量
在安装成功后,还需要配置Java的环境变量,具体如下所示。首先在电脑桌面上鼠标右键点击“计算机”或者“此电脑”,然后点开属性面板,点击“高级系统设置”,在弹出的“系统属性”面板中点击“高级”选项卡,最后点击“环境变量”按钮。
在环境变量面板中,点击“系统变量”下方的“新建”按钮,在“变量名”输入框中输入“JAVA_HOME”;在“变量值”输入框中输入安装步骤中选择的JDK安装目录,比如“E:\Program Files\Java\jdk1.8.0_311”,点击“确定”按钮,如图1-8所示。
.;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
具体如图1-9所示。
1.6.1.4 JDK环境变量验证
在完成环境变量配置后,还需要验证是否配置正确。
打开cmd命令窗口,输入java -version命令。这里演示安装的JDK版本为1.8.0_311,如果环境变量配置正确,命令窗口会输出正确的JDK版本号:
java version "1.8.0_311"
如果验证结果如图1-10所示,则表示JDK安装成功。如果输入命令后报错,则需要检查在环境变量配置步骤中是否存在路径错误或者拼写错误并进行改正。
1.6.2 Maven的安装和配置
Maven是Apache的一个软件项目管理和构建工具,它可以对Java项目进行构建和依赖管理。本课中所有源码都选择了Maven作为项目依赖管理工具,本节内容将讲解Maven的安装和配置。
1.6.2.1 下载Maven安装包
打开浏览器,在Apache官网找到Maven下载页面,其下载文件列表如图1-11所示。点击“apache-maven-3.8.4-bin.zip”即可完成下载。
下载地址:https://maven.apache.org/download.cgi
1.6.2.2 安装并配置Maven
首先安装Maven并不像安装JDK一样需要执行安装程序,直接将下载的安装包解压到相应的目录下即可。这里笔者解压到E:\anzhuang\apache-maven-3.8.4目录下,如图1-12所示。
;%MAVEN_HOME%\bin;
1.6.2.3 Maven环境变量验证
在Maven环境变量配置完成后,同样需要验证是否配置正确。
打开cmd命令窗口,输mvn -v命令。这里安装的Maven版本为3.8.4,安装目录为E:\anzhuang\apache-maven-3.8.4。如果环境变量配置正确,在命令窗口会输出如图1-14所示的验证结果,表示Maven安装成功。
1.6.2.4 配置国内Maven镜像
在完成以上步骤后就可以正常使用Maven工具了。为了获得更好的使用体验,建议国内开发人员修改一下Maven的配置文件。
国内开发人员在使用Maven下载项目的依赖文件时,通常会面临下载速度缓慢的情况,甚至出现“编码5分钟,启动项目半小时”的窘境。
由于每次下载新的依赖文件都需要通过外网访问Maven中央仓库,如果不进行配置的优化处理则会极大地影响开发流程。笔者建议使用国内公司提供的中央仓库镜像,比如阿里云的镜像、华为云的镜像。另外一种做法是自己搭建一个私有的中央仓库,并修改Maven配置文件中的mirror标签来设置镜像仓库。
这里以阿里云镜像仓库为例,介绍如何配置国内Maven镜像加快依赖的访问速度。
进入Maven安装目录E:\anzhuang\apache-maven-3.8.4,在conf文件夹中打开settings.xml配置文件。添加阿里云镜像仓库的链接,修改后的settings.xml配置文件如下:
<localRepository>E:\anzhuang\apache-maven-3.8.4\repo</localRepository>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
在配置完成后,可以直接访问国内的镜像仓库,从而使Maven下载jar包依赖的速度变得更快,可以节省很多时间。
1.6.3 开发工具IDEA的安装和配置
Java开发人员常使用的开发工具包括Eclipse、MyEclipse和IDEA。
关于在Spring Boot项目开发时编辑器的选择,笔者推荐IDEA作为主要的开发工具。IDEA对于开发人员非常友好和方便,本课程关于项目的开发和演示都会选择使用IDEA编辑器。
IDEA全称IntelliJ IDEA,是用Java语言开发的集成环境(也可用于其他语言)。IntelliJ在业界被公认为最好的Java开发工具之一,尤其在智能代码助手、代码自动提示、重构、J2EE支持、JUnit单元测试、CVS版本控制、代码审查、 创新的GUI设计等方面的功能可以说是超常的。
1.6.3.1 下载IDEA安装包
打开浏览器,进入JetBrains官网。在进入IDEA页面后能够查看其基本信息和特性介绍,如图1-15所示。感兴趣的可以在该页面了解IDEA编辑器更多的信息。
下载地址:https://www.jetbrains.com/
大家根据所使用的系统版本下载对应的安装包即可,本书将以Ultimate版本为例进行讲解。
1.6.3.2 安装IDEA及其功能介绍
在下载完成后,双击下载的安装包程序,按照IDEA安装界面的提示,依次点击“Next”按钮即可完成安装,如图1-17所示。
(1)New Project:创建一个新项目。
(2)Open:打开一个计算机中已有的项目。
(3)Get from VCS:通过在版本控制系统中打开项目获取一个项目,比如通过GitHub、Gitee、GitLab以及自建的版本控制系统。
在创建或者打开一个项目后,则进入IDEA编辑器的主界面。这里以一个基础的Spring Boot项目为例进行介绍。在打开项目后,IDEA编辑器界面如图1-19所示。
1.6.3.3 配置IDEA的Maven环境
想要之前安装的Maven可以正常在IDEA中使用,则需要进行以下配置。依次点击菜单栏中的按钮“File→Settings→Build,Execution,Deployment→Build Tools→Maven”,在Maven设置面板中配置Maven目录和settings.xml配置文件位置,,如图1-20所示。
1.6.4 开发工具WebStorm的安装和配置
前端开发工具还是比较多的,对于java开发人员来说,WebStrom绝对是不错的选择,因为它跟IDEA是同一家公司出的,熟练使用IDEA的java开发人员,对于使用WebStrom还是计较容易上手的。
WebStorm 是一个适用于 JavaScript 和相关技术的集成开发环境。类似于其他 JetBrains IDE,它也会使您的开发体验更有趣,自动执行常规工作并帮助您轻松处理复杂任务。
1.6.4.1 下载WebStrom安装包
打开浏览器,进入JetBrains官网。在进入WebStrom页面后能够查看其基本信息和特性介绍,如图1-21所示。感兴趣的读者可以在该页面了解WebStrom编辑器更多的信息。
下载地址:https://www.jetbrains.com/zh-cn/webstorm/
1.6.4.2 安装WebStrom及其功能介绍
在下载完成后,双击下载的安装包程序,按照WebStrom安装界面的提示,依次点击“Next”按钮即可完成安装,如图1-22所示。
1.6.5 安装 VirtualBox
VirtualBox 英 [ˈvɜːtʃuəl bɒks] 美 [ˈvɜːrtʃuəl bɑːks] 是一款开源虚拟机软件。VirtualBox 是由德国 Innotek 公司开发,由Sun Microsystems公司出品的软件,使用Qt编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。 它不仅具有丰富的特色,而且性能也很优异。 它简单易用,可虚拟的系统包括Windows 、Mac OS X、Linux等。
1.6.5.1 下载VirtualBox
下载地址:https://www.virtualbox.org/
打开浏览器,进入virtualbox官网。在进入virtualbox页面后能够查看其基本信息和特性介绍,如图1-24所示。感兴趣的读者可以在该页面了解virtualbox更多的信息。
1.6.5.2 安装VirtualBox
在下载完成后,双击下载的安装包程序,按照virtualbox安装界面的提示,依次点击“下一步”按钮即可完成安装,如图1-26所示。
1.6.6 安装Vagrant
vagrant是一个操作虚拟机的工具。它提供了一套高效而便利的虚拟机管理方式,通过命令和配置文件,当然也要基于vagrant自身的约定,就能很快的完成一套开发环境的部署,并可以打包传播,极大的方便了在工作环境中,各个开发环境不一致的问题,也解决了重复配置环境的浪费。
1.6.6.1 下载Vagrant安装包
打开浏览器,在Vagrant官网找到Vagrant下载页面,其下载文件列表如图1-27所示。点击“aDownload ”即可完成下载。
1.6.6.2 安装Vagrant
在下载完成后,双击下载的安装包程序,按照Vagrant安装界面的提示,依次点击“Next”按钮即可完成安装,如图1-28所示。
1.6.6.3 Vagrant验证
安装完后输入如下命令,验证是否安装成功:
vagrant
如果验证结果如图1-28所示,则表示Vagrant安装成功。
1.6.7 安装centos7
CentOS是免费的、开源的、可以重新分发的开源操作系统,CentOS(Community Enterprise Operating System,中文意思是社区企业操作系统)是Linux发行版之一。
1.6.7.1 使用vagrant安装centos7
输入以下命令进行安装
$ vagrant init centos/7
执行完上面的命令后,会在用户指定目录下生成Vagrantfile文件,如图1-29和图1-30所示。
vagrant up
下载镜像过程比较漫长 ,请耐心等待,如图1-31所示。
vagrant ssh
到此,centos7就完美安装好了。
1.6.7.2 虚拟机网络设置
安装好centos7后,我们需要修改网络配置,只需要修改Vagrantfile文件即可,如下所示:
config.vm.network "private_network", ip: "192.168.56.10"
修改后,重启虚拟机即可,输入ip addr命令查看,是否配置成功,如图1-32所示:
ip addr
1.6.7.3 开启远程登陆
修改“/etc/ssh/sshd_config” 文件,把“PasswordAuthentication”设置成“yes”即可。
PasswordAuthentication yes
修改后重启sshd,命令如下所示。
systemctl restart sshd
注意: 修改文件时需要使用root用户,默认密码是:vagrant
1.6.8 安装docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
1.6.8.1 卸载系统之前的docker
输入如下命令卸载系统之前的docker引擎,如图1-35所示。
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
1.6.8.2 安装依赖包
输入如下命令安装:
yum install -y yum-utils
1.6.8.3 配置docker仓库
输入如下命令(官方):
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
或者(阿里云)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
1.6.8.4 安装docker引擎
输入如下命令:
yum install docker-ce docker-ce-cli containerd.io
1.6.8.5 启动docker
输入如下命令:
systemctl start docker
输入如下命令查看docker是否安装成功,如图1-36所示
docker -V
1.6.8.6 设置docker开机自启
输入如下命令:
systemctl enable docker
1.6.8.7 配置docker阿里云镜像加速
输入如下命令:
mkdir -p /etc/docker
输入如下命令:
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://m0xbxmz4.mirror.aliyuncs.com"]
}
EOF
输入如下命令重启:
systemctl daemon-reload
systemctl restart docker
1.6.9 安装mysql5.7
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
1.6.9.1 下载mysql5.7 镜像
输入如下命令拉取mysql5.7镜像:
docker pull mysql:5.7
1.6.9.2 创建MySQL容器
输入如下命令创建实例:
docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
参数如图1-37所示。
1.6.9.3 配置mysql
先创建 my.cnf 文件,输入命令:
cd /mydata/mysql/conf
vi my.cnf
复制以下内容:
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
保存退出,重启mysql容器即可:
docker restart mysql
1.6.9.4 设置启动docker时,即运行mysql
输入以下命令:
docker update mysql --restart=always