# 一、SpringBoot基础
# 1.1 SpringBoot简介
官方
- SpringBoot 官网:https://spring.io/projects/spring-boot (opens new window)
- SpringBoot 官方代码:https://github.com/spring-projects/spring-boot (opens new window)
文档
- SpringBoot 中文文档:https://www.jcohy.com/projects/spring-boot (opens new window)
项目案例
- Guns:https://gitee.com/naan1993/guns (opens new window)
- yshop:https://gitee.com/guchengwuyue/yshopmall/tree/master (opens new window)
- https://gitee.com/xiandafu/springboot-plus (opens new window)
SpringBoot是一个基于Spirng框架搭建的微服务开发框架,它的主导思想是约定优于配置。
使用注解开发,让Spring框架更加便捷快速,尽可能地自动配置。SpringBoot的目的是简化Spring应用的初始搭建及开发过程。
它提供了通过Maven依赖的starter,可以直接获取开发所需的相关包。
它内嵌了Tomcat、Jetty等服务器,可以一键启动和部署,无须再部署成WAR文件。
# 二、SpringBoot配置文件
# 2.1 配置文件引用系统环境变量
在开发软件的过程中,有些值是需要随着环境改变的,比如数据库的IP端口,用户名等。我们不能把这些值硬编码进入代码中,再打包成jar包,这样使用起来是很不方便的。所以我们需要env
,在启动jar包的时候传入变量。
# 1、配置环境变量
- 开发dev环境配置
在开发中,使用IntelliJ IDEA修改启动配置,即可在开发环境中对这些变量进行配置。
- 打成jar包运行时配置
java -DSERVER_PORT=9999 -DtestEvn=abc -jar xxx.jar
1
说明:
“=”号左右不能有空格,多个属性赋值用空格隔开;
不给动态变量赋值直接启动项目程序会使用默认值变量名冒号后面的值;
系统环境变量配置
在系统环境变量中配置后,譬如Windows里配置的JAVA_HOME,可以直接在Springboot的配置文件中获取。
# 2、使用环境变量
- application.properties中使用环境变量
使用${变量名}
就可以声明一个使用环境变量的值。
如果想向这个值声明一个默认值,以确保未在环境变量中找到此值时不会出错,使用${变量名:默认值}
。
server.port=${SERVER_PORT:8080}
1
- 代码获取系统变量
public void justTest() {
String profile = System.getenv().getOrDefault("SPRING_PROFILES_ACTIVE","local");
System.out.println("system environment is " + profile);
}
1
2
3
4
2
3
4
# 三、SpringBoot整合
# 3.1 API多版本实现
在以SpringBoot开发Restful接口时,由于模块,系统等业务的变化,需要对同一接口提供不同版本的参数实现(老的接口还有模块或者系统在用,不能直接改,所以需要不同版本)。
SpringBoot本身就很好的支持多版本,可以更加优雅的实现多版本接口。
# 1、url路径控制
多个类分别设置不同url,例如:
@RequestMapping("/v1/users")
public class HelloWorldOneController {
}
@RequestMapping("/v2/users")
public class HelloWorldTwoController {
}
1
2
3
4
5
6
2
3
4
5
6
API调用:
http://127.0.0.1:8088/v1/users/hello
http://127.0.0.1:8088/v2/users/hello
1
2
2
# 2、请求参数控制
@GetMapping(params = "version=1")
public Map<String, Object> showHelloWorldone(){
Map<String, Object> map = new HashMap<>();
map.put("msg", "HelloWorld1");
return map;
}
@GetMapping(params = "version=2")
public Map<String, Object> showHelloWorldtwo(){
Map<String, Object> map = new HashMap<>();
map.put("msg", "HelloWorld2");
return map;
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
API调用:
http://127.0.0.1:8088/users?version=1
http://127.0.0.1:8088/users?version=2
1
2
2
# 3、通过header控制
@GetMapping(headers = "API-Version=1")
public Map<String, Object> showHelloWorldone(){
Map<String, Object> map = new HashMap<>();
map.put("msg", "HelloWorld1");
return map;
}
@GetMapping(headers = "API-Version=2")
public Map<String, Object> showHelloWorldtwo(){
Map<String, Object> map = new HashMap<>();
map.put("msg", "HelloWorld2");
return map;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
API调用:
# 4、通过Media Type控制
@GetMapping(produces = "application/vnd.company.app-v1+json")
public Map<String, Object> showHelloWorldone(){
Map<String, Object> map = new HashMap<>();
map.put("msg", "HelloWorld1");
return map;
}
@GetMapping(produces = "application/vnd.company.app-v2+json")
public Map<String, Object> showHelloWorldtwo(){
Map<String, Object> map = new HashMap<>();
map.put("msg", "HelloWorld2");
return map;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
API调用: