1、什么是SpringBoot
SpringBoot
是基于Spring
的基础上提供了一套全新的框架,其目的是为了在开发时简化Spring
的相关配置及开发过程。在SpringBoot
未出来之前,准备搭建一个Spring
的开发环境需要配置一堆的XML
文件,而SpringBoot
就是去除了大量的XML
配置文件,简化了复杂的依赖管理。
Spring Boot
集成了大量常用的第三方库配置,Spring Boot
应用中这些第三方库几乎可以是零配置的开箱即用(out-of-the-box
),大部分的Spring Boot
应用都只需要非常少量的配置代码(基于Java
的配置),开发者能够更加专注于业务逻辑。
2、SpringBoot特征
- 独立运行的
Spring
项目,使用jar
包的形式独立运行,只需通过命令java -jar xx.jar
即可运行。 - 内嵌
Servlet
容器(例如Tomcat
、Jetty
或者Undertow
等),应用无需打成WAR
包 。 - 提供
starter
简化Maven
配置,提供了一系列的starter
项目对象模型(POMS
)来简化Maven
配置。 - 提供了大量的默认自动配置,来简化项目的开发,开发人员也通过配置文件修改默认配置。
- 自带应用监控(如指标、健康检查和外部化配置)。
- 没有代码生成和
XML
配置。
3、快速搭建SpringBoot
- 引入
maven
依赖
首先引入parent
依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
</parent>
因为是要开发一个web
项目,因此需要引入web
依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
- 创建启动类
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
- 创建
controller
类
@RestController
@RequestMapping(path = "/v1/index")
public class IndexController {
@GetMapping(path = "")
public String index(){
return "Hello Spring Boot!";
}
}
- 启动项目
Connected to the target VM, address: '127.0.0.1:54766', transport: 'socket'
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.5.3)
2021-08-04 23:16:55.694 INFO 15528 --- [ main] com.tenghu.sb.Application : Starting Application using Java 1.8.0_301 on Arvin with PID 15528 (E:\project\java\spring-boot-study\target\classes started by admin in E:\project\java\spring-boot-study)
2021-08-04 23:16:55.696 INFO 15528 --- [ main] com.tenghu.sb.Application : No active profile set, falling back to default profiles: default
2021-08-04 23:16:56.231 INFO 15528 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2021-08-04 23:16:56.237 INFO 15528 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2021-08-04 23:16:56.237 INFO 15528 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.50]
2021-08-04 23:16:56.292 INFO 15528 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2021-08-04 23:16:56.292 INFO 15528 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 567 ms
2021-08-04 23:16:56.503 INFO 15528 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2021-08-04 23:16:56.509 INFO 15528 --- [ main] com.tenghu.sb.Application : Started Application in 1.065 seconds (JVM running for 1.607)
2021-08-04 23:17:07.919 INFO 15528 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-08-04 23:17:07.919 INFO 15528 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2021-08-04 23:17:07.920 INFO 15528 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms
看到这个结果,表示SpringBoot
项目就已经启动成功了,现在使用浏览器访问路径http://localhost:8080/v1/index
就可以看到浏览器输出结果:Hello Spring Boot!
。
以上是手动建立一个空的maven
项目,手动添加依赖的方式创建一个简单的spring boot
项目,另外还有两种方式可以快速生成spring boot
项目:
- 使用IDEA,里面已经集成了SpringBoot插件
- 使用官网提供的创建SpringBoot插件。https://start.spring.io/
4、SpringBoot配置文件
从上面的简单例子已经可以看出,我们没有将项目打包成war
文件发布到Tomcat
容器,就可以启动项目,并且从日志上看出端口默认就是8080
,从上面特性已经指出SpringBoot
内嵌了Tomcat
容器,并且设置了必须的一些默认值,那么如果我们想替换相关默认值,就可以使用自定义的配置文件来覆盖默认配置。
SpringBoot
提供了两种配置文件类型:properties
和yml
(而yml
也可以写成yaml
)。默认配置文件名称为:application
,放在resources
目录下。这两种配置文件在同一级的优先级为:properties
>yml
>yaml
比如把默认端口改为8088
,上面访问路径为http://localhost:8080/v1/index
,按照之前的习惯,通常是主机后面会跟项目名,也可以通过配置文件配置。
使用yaml
方式配置:
server:
servlet:
context-path: /spring-boot
port: 8088
注意:
yaml
的配置方式:
号后面必须有空格。
简单介绍下yaml
的基本语法:
- 大小写敏感
- 数据值前面必须有空格(也就是
:
号后面),作为分隔符 - 使用缩进表示层级关系
- 缩进时不允许使用
Tab
键,只允许使用空格(因为各个系统Tab
对应的空格数目可能不同,导致层级混乱) - 缩进的空格数目不重要,只要相同层级的元素左对齐就行
-
#
表示注释,从这个字符到行尾,都会被解析器忽略
yaml
的数据格式:
- 对象(map): 键值对的集合
person:
name: lisi
# 行内写法
person: {name: lisi}
- 数组:一组按次排列的值
names:
- zhangsan
- lisi
# 行内写法
names: [zhangsan,lisi]
- 纯量:单个的、不可再分的值
msg1: `hello \n world` #单引号忽略转义字符
msg2: "hello \n world" #双引识别转义字符
yaml
参数引用:
有时候在配置一个参数,想被多个地方引用,可以这样配置:
name: zhangsan
person:
name: ${name} #引用上面定义的name的值
使用properties
配置:
server.servlet.context-path=/spring-boot
server.port=8088
注意:配置
context-path
必须是/
开头
启动项目从日志输出:
Tomcat started on port(s): 8088 (http) with context path '/spring-boot'
这个时候我们的访问路径就是:http://localhost:8088/spring-boot/v1/index
5、读取配置内容
在实际开发时,有时候需要做一些初始化的自定义配置,那么怎么在代码里面获取到配置文件的自定义配置,比如自定义配置name: zhangsan
。读取配置内容有如下三种方式:
- 使用注解
@Value
@Value("${name:lisi}")
private String name;
@GetMapping(path = "")
public String index(){
return String.format("Hello %s Spring Boot!",name);
}
访问结果:Hello zhangsan Spring Boot!
,使用@Value
注解就可以获取配置文件的自定义配置,:
后面表示默认值,如果配置文件没有配置,则取默认值。
- Environment
@Autowired
private Environment environment;
System.out.println(String.format("使用Environment获取配置name:%s",environment.getProperty("name")));
输出结果:使用Environment获取配置name:zhangsan
- @ConfigurationProperties
定义一个User
类
@Component
@ConfigurationProperties(prefix = "user")
@Data
public class User {
private String name;
private int age;
private List<String> address;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", address=" + address +
'}';
}
}
必须使用@Component
和@ConfigurationProperties
注解,@Data
是使用了lombok
插件。如果需要使用lombok
,需要在IDEA安装Lombok
插件,引入lombok
依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
配置文件如下配置:
user:
name: zhangsan
age: 12
address:
- sichuang
- hunan
在controller
中使用
@Autowired
private User user;
System.out.println(user.toString());
输出结果:User{name='admin', age=12, address=[sichuan, hunan]}
6、使用Profile多环境切换
在实际开发场景中,我们一般有开发、测试、生产环境,每个环节的某些配置会不一样,那么怎么来解决不同环境配置的问题,下面详细介绍使用Profile
多环境的切换。
profile
多环境配置方式:
- 多
profile
文件的方式,提供多个配置文件,每个文件代表一种环境。- application-dev.properties/yml 开发环境
- application-test.properties/yml 测试环境
- application-prod.properties/yml 生产环境
-
yml
多文档方式:- 在yml配置文件中使用
---
分割不同配置
- 在yml配置文件中使用
profile
激活多环境方式:
- 配置文件,在配置文件使用配置
spring.profiles.active=dev
- 虚拟机参数:在
IDEA
的VM options
指定:-Dspring.profiles.active=dev
- 命令行参数:
- 打包情况下:
java -jar xxx.jar --spring.profiles.active=dev
- 使用
IDEA
下的Program arguments
指定:--spring.profiles.active=dev
- 打包情况下:
多文件的方式这里就不做操作了,上面介绍已经说明了,按照标准的文件格式命名就行,根据实际情况选择是用properties
还是yml
的方式。下面介绍下yml
多文档的方式:
# 开发环境
---
spring:
config:
activate:
on-profile: dev
server:
port: 8081
# 测试环境
---
spring:
config:
activate:
on-profile: test
server:
port: 8082
# 生产环境
---
spring:
config:
activate:
on-profile: prod
server:
port: 8082
---
# 公用配置
server:
servlet:
context-path: /spring-boot
至于激活的方式,就参考上面的测试即可。