什么是SpringBoot?SpringBoot可以快速启动一个生产级的项目,简化开发流程,让java开发变得简单粗暴。在以前学习使用SSM框架时,需要复杂、大量的配置文件和依赖,没有人管理极易造成依赖冲突,高低版本不兼容等问题。

为了更好的理清SSM开发的流程,这里简单回忆一下:配置环境–>创建工程–>构建目录结构–>组件依赖管理–>配置web容器–>设置组件参数–>业务开发–>测试与构建–>手动部署–>运维与监控等十个步骤。

那么使用SpringBoot后,应用开发流程就变为:配置环境(不需要搭建tomcat)–>Spring Initializr–>配置参数(可选)–>业务开发–>自动构建–>自动部署–>运维与监控等七个步骤。

SpringBoot的核心特性

SpringBoot的核心特性有以下6点:1、极低的学习成本。只需要你会spring,那么就可以在一个小时内学会SpringBoot;2、可独立运行的spring项目。当你使用ssm框架时需要将项目编译为war包,然后上传至web服务器Tomcat,然后启动Tomcat才能完成项目的部署(单台可行,多台复杂),而SpringBoot不需要手动安装Tomcat,在项目构建的时候,SpringBoot会自动将依赖的Tomcat组件内嵌到依赖中,随着SpringBoot的启动,Tomcat也会随着启动服务,同时在编译时也不再提供war包,而是java中标准的jar包,因此可以将jar包批量上传至服务器以后,通过服务器脚本自动所有服务;3、习惯优于配置极大的提升了开发效率。SpringBoot对集成的框架进行了封装和简化,尤其是在数据处理的部分,原本几十行的代码现在只需要几行就能完成。以前在开发的时候会经常使用代码生成器来生成可以复用的代码,这种方式在SpringBoot中已经被摈弃了,SpringBoot通常使用大量的注解来进行实现;4、极简的组件依赖,自动发现与自动装配。SpringBoot在设计之初就遵循了“习惯优于配置”的开发方式,它会将经常使用的配置提前处理好,我们只需在Maven中指定一个starter(启动器)即可,剩下的事情交给SpringBoot就好了。另外SpringBoot采用自动发现与自动装配策略,对于一些主流的框架,SpringBoot基本上都支持。假设我们需要一个第三方框架,如Mybatis,只需要在Maven中引入Mybatis后,SpringBoot便能在启动时自动发现Mybatis的存在,并将默认的最优配置准备好,我们要做的就是直接实现与业务逻辑相关的开发。即便是某个框架SpringBoot默认不支持,我们也可以自己编写配置类来完成自定义设置;5、提供运行时的应用监控。在程序开发的过程中,程序员往往只关注业务逻辑的实现,对服务器压力,内存占用,数据库负载等运行时重要指标置之度外。在程序上线后,运维人员对服务器的运行状况一头雾水,只有在服务器奔溃的时候才可以进行反馈,根本做不到提前预警。好在SpringBoot天生就提供了对应用监控的端口,我们可以通过后台就能直观的了解到项目的运行状况,提前预防服务器宕(同当字)机;6、与分布式架构和云计算的天然集成。在庞大的互联网行业中,分布式架构与大数据,云计算等技术已经是基础设施,虽然我们看不见,但是它们却无时无刻不在影响着我们的生活,当然这些也不会被SpringBoot所遗忘。在庞大的SpringBoot生态中,SpringData与SpringCloud一枝独秀。SpringData用于海量数据处理与交互,而SpringCloud则提供了分布式架构的底层支持,两者相辅相成。而SpringBoot则像胶水一样将这些框架粘合在一起,并提供了简单、最优化的开发方式,即使你可能对SpringData、SpringCloud不是特别了解,但是在SpringBoot下一样能开发出优秀的分布式,大数据应用程序。

SpringBoot开发环境准备

SpringBoot开发要求JDK版本必须在8及以上;同时推荐大家安装intellij IEDA Ultimate(奥特媚特)也就是旗舰版。本套笔记SpringBoot版本为2.1.14。

SpringBoot的目录结构

从网上找了一张图片,来了解SpringBoot的目录结构:

另外普及一下GroupId(俗称:包结构)、ArtifactId(俗称:项目名)后面会使用到。

使用Maven构建SpringBoot应用

第一步,使用Maven新建一个项目myspringboot(不使用模板);
第二步,在resources文件夹里面新建static和templates文件夹,同时在resources文件夹中新建application.properties配置文件,注意名称不能修改。
第三步,配置pom.xml文件,在该文件中新增以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<parent>
<!--spring-boot-starter-parent帮我们引入了springboot中最基本的组件-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>

<dependencies>
<dependency>
<!--使用启动器来描述工程所要支持的功能,web表示向其中增加了支持Javaweb的能力,前面已经配置好了版本号-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>

<build>
<!--定义打包方式,通过插件方式进行打包-->
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

解释一下上面各依赖的作用。spring-boot-starter-parent是一个特殊的Starter,提供了一些Maven的默认配置,同时还提供了dependency-management,可以使开发者在引入其他依赖时不必输入版本号,便于依赖管理。SpringBoot中提供的Starter非常多,这些Starter主要为第三方库提供自动配置,这里是要开发一个web项目,因此需要引入一个Web的Starter,也就是spring-boot-starter-web。由于后续需要将SpringBoot应用直接打包成jar包运行,所以需要添加一个plugin,也就是spring-boot-maven-plugin

第四步,在java源程序包中新建com.envy.myspringboot.controller包,并在里面新建一个MyController类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.envy.myspringboot.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MyController {

@RequestMapping(value = "/index")
@ResponseBody
public String index(){
return "index";
}
}

你会发现上面的代码就是SpringMVC中controller中的代码,是的SpringBoot就是这么与SpringMVC完美结合。

第五步,在controller包的同级目录,即com.envy.myspringboot包中,新建MySpringBootApplication.java类,注意这个类的名称通常是项目名称字母大写+Application组成。该类中的代码为:

1
2
3
4
5
6
7
8
9
10
11
12
package com.envy.myspringboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//说明这是一个Springboot应用的入口类
@SpringBootApplication
public class MySpringBootApplication {
public static void main(String[] args){
//启动SpringBoot应用
SpringApplication.run(MySpringBootApplication.class);
}
}

这个类是Springboot应用的入口类,里面包含了main方法,同时还有SpringApplication.run()方法,之后直接运行这个main方法就能启动SpringBoot应用。(前面说了SpringBoot中通过starter启动了Tomcat)

当你在控制台中看到spring以及Started MySpringBootApplication in 3.316 seconds 字样时,表明SpringBoot已经成功启动了,然后你可以打开浏览器,输入http://localhost:8080/index即可发现页面上已经显示index了。

虽然使用Maven可以构建SpringBoot应用,但是从上面的过程可以看出这个步骤还是挺复杂的,那么有没有什么简单的工具呢以便于我们快速搭建SpringBoot的开发环境?答案是有的,可以使用spring Initializr来构建SpringBoot应用。

使用spring Initializr构建SpringBoot应用

第一步,使用spring Initializr新建一个项目ispringboot,具体操作如下(按照图中序号依次进行即可):

接着在com.envy.ispringboot包中新建controller包,并在controller包中新建MyController类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.envy.ispringboot.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MyController {

@RequestMapping(value = "/index")
@ResponseBody
public String index(){
return "index";
}
}

最后运行IspringbootApplication类中的main方法即可启动SpringBoot项目,怎么样是不是觉得非常简单,比使用Maven简单多了,而pom.xml文件中的依赖都有,还增加了单元测试依赖。

接下来对SpringBoot入口类进行简单的介绍:1、入口类命名通常是项目名称+Application.java结尾;2、入口类上需要增加@SpringBootApplication注解;3、应用的启动需要使用SpringApplication.run()方法,如下面一段代码所示:

1
2
3
4
5
6
@SpringBootApplication
public class IspringbootApplication {
public static void main(String[] args) {
SpringApplication.run(IspringbootApplication.class, args);
}
}

然后就是SpringBoot的启动流程:

应用初始化通常包括启动Tomcat、初始化日志组件、初始化数据源等各种各样的数据池、连接池。当这四步都执行完后,就能在控制台上看到Started IspringbootApplication in xxx seconds等字样。

接下来介绍SpringBoot中的常用设置,这些在以后开发过程中可能会经常使用到。

SpringBoot中的常用设置

我从网上找了一张图片,这个图片把使用频率较高的配置项都进行了罗列:

注意上面的这些配置项都是在application.properties或者是application.yml文件中配置的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#配置Tomcat启动的默认端口号
server.port=8081

#当Tomcat中存在多个项目时,可以通过设置上下文名称,用于区别不同的url
server.servlet.context-path=/ispringboot
#注意此时上面的访问URL已经变成http://localhost:8081/ispringboot/index

#配置日志输出位置
logging.file=F:\\Springboot\\Test\\ispringboot\\ispringboot.log

#配置日志文件记录等级
#springboot中日志级别由低到高依次为:debug-->info-->warn-->error-->fatal(灾难)
logging.level.root=info

# 是否开启debug模式
debug=true

# 配置数据源
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root

springboot配置文件

springboot不仅支持属性配置文件application.properties,还支持YAML格式文件application.yml

YAML是一种简洁的非标记语言。YAML以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁易读。YAML格式语法:key:(空格)value,这样看起来似乎很像json,的确是很像。YAML使用空格代表层级关系,并以“:”结束。其实也很像stylus语法。下面就是使用YAML语法配置的application.yml文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#debug:true
debug: true
#logging.level.root和logging.file
logging:
level:
root: info
file: F:\\Springboot\\Test\\ispringboot\\ispringboot.log
# spring.datasource.driver-class-name
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test
username: root
password: root

SpringBoot自定义配置项

SpringBoot允许我们自定义应用配置项,在程序运行时允许动态加载,这为程序提供了良好的可维护性。在实际项目开发中,我们通常将项目的自定义信息放在配置文件中。

假设我们有一个个人博客性质的网站,现在想对一些信息拿出来,作为一个单独文件与便于及时进行修改,此时我们可以把可能需要修改的内容拿出来放在配置文件中:

1
2
3
4
5
6
7
#个人博客配置项
site:
config:
name: 余思博客
description: 记录自己成长的点滴.
is-comment: true
has-copyright: 2017

然后在MyController文件中,通过注解给属性赋值的方式来获取配置文件的值并赋值给属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Controller
public class MyController {
@Value("${site.config.name}")
private String name;
@Value("${site.config.description}")
private String description;
@Value("${site.config.is-comment}")
private Boolean isComment;
@Value("${site.config.has-copyright}")
private Integer hasCopyright;

@RequestMapping(value = "/info")
@ResponseBody
public String info(){
return String.format("name:%s,description:%s,is-comment:%s,has-copyright:%s",
name,description,isComment,hasCopyright);
}
}

然后运行项目,在浏览地址栏中输入:http://localhost:8080/info即可看到信息:

1
name:余思博客,description:记录自己成长的点滴.,is-comment:true,has-copyright:2017

SpringBoot环境配置文件

在开发的时候我们连接的是本地的测试数据库,若程序上线则将连接生产数据库,如果我们的工程只有一个配置文件的话,则会导致上线时修改大量的配置信息,出现一个配置信息错误可能导致系统奔溃。如果针对不同的配置环境提供不同的配置文件,这是一个不错的想法。SpringBoot可针对不同的环境提供不同的Profile文件也就是配置文件。Profile文件默认命名格式为application-{env}.yml,然后使用spring.profiles.active选项来指定不同的Profile。

举个例子,新建三个配置文件:application.ymlapplication-dev.ymlapplication-prd.yml,那么系统默认认为application.yml为主配置文件。

application-dev.yml中的代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#debug:true
debug: true
#logging.level.root和logging.file
logging:
level:
root: info
file: F:\\Springboot\\Test\\ispringboot\\ispringboot.log
# spring.datasource.driver-class-name
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test
username: root
password: root
#个人博客配置项
site:
config:
name: 余思博客
description: 记录自己成长的点滴.
is-comment: true
has-copyright: 2017

application-prd.yml文件中的代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#debug:true
debug: false
#logging.level.root和logging.file
logging:
level:
root: info
file: /local/user/app-prd.log
# spring.datasource.driver-class-name
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.2.1:3308/prd
username: root2
password: !QAZ2wsx#EDC
#个人博客配置项
site:
config:
name: 言思博客
description: 记录自己成长的点滴.
is-comment: true
has-copyright: 2017
#port:80
server:
port: 80

那么application.yml主配置文件中只需要如下设置即可指定当前环境使用哪个yml文件作为配置文件:

1
2
3
spring:
profiles:
active: dev

这样修改是不是非常便捷。

SpringBoot打包与运行

使用Maven的package命令可以将SpringBoot项目生成可独立运行的Jar包;然后使用java -jar xxx.jar命令来启动SpringBoot应用;注意Jar包可自动加载同目录的application配置文件。

点击右上角的Edit Configurations按钮

点击左上角的+号,然后选择Maven,在右侧Name中填入package(命令行名称),接着在Command line中输入package打包命令:

然后点击确定,并选择刚才的package,点击右侧绿色的倒三角符号,开始打包项目:

当控制台输出类似以下信息,说明已经打包完成:

1
2
3
4
5
6
7
[INFO] --- maven-jar-plugin:3.1.2:jar (default-jar) @ ispringboot ---
[INFO] Building jar: F:\Springboot\Test\ispringboot\target\ispringboot-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:2.2.5.RELEASE:repackage (repackage) @ ispringboot ---
[INFO] Replacing main artifact with repackaged archive
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS

可以发现这个jar包的位置为: F:\Springboot\Test\ispringboot\target\ispringboot-0.0.1-SNAPSHOT.jar

然后使用cmd命令进入DOS状态,在这个ispringboot-0.0.1-SNAPSHOT.jar包所在文件夹内,输入java -jar ispringboot-0.0.1-SNAPSHOT.jar即可运行该应用:

不知你发现没有,刚才这个Jar我们看到它使用的是prd,也就是生产环境:

如果我们想让它运行在dev开发环境下,那应该怎样操作呢?有人说这是一个jar包可以解压后,通过修改主配置文件方式啊,这种方式似乎是可行的,但是假设某个人电脑上此时没有安装可以解压jar包的软件呢?这时候不就没办法了吗?

其实SpringBoot早就想到这个问题了,你只需要将三个配置文件:application.ymlapplication-dev.ymlapplication-prd.yml放在之前打包成的jar的文件夹内即可(注意它们四个必须在同一个文件夹中),然后通过修改这三个配置文件,jar包会优先读取外面三个yml文件的相关配置。尝试将外部的application.yml文件中的prd修改为dev后,再次运行jar包发现确实已经发生了变化。