前言
本文是我学习spring boot一段时间之后,闲来无事整理出来的,旨在整理思路,梳理知识点。借鉴了不少其他博客,其中也有自己的理解。
这一篇要比我整理的更加详细易懂,也是我借鉴比较多的一篇,作者就Spring boot 写了一系列博客,需要的人请移步~
传送门: https://www.cnblogs.com/zheting/p/6707036.html
application.properties
关于Spring Boot应用的配置内容都可以集中在该文件中,根据我们引入的不同starter模块,可以在这里定义端口号、数据库连接信息、日志级别等各种配置信息。
同时,Spring Boot 的配置文件还支持YAML文件。
YAML 目前还有一些不足,无法通过@PropertySource 注解来加载配置。但是,YAML将属性加载到内存中保存的时候是有序的,所以当配置文件中的信息需要具备顺序含义时,YAML的配置方式比起properties配置文件更有优势。
YAML文件格式:
server:
port: 9007
context-path: /market
management:
port: 8007
security:
enabled: false
.properties 文件格式:
server.port=9007
server.context-path=/market
management.port=8007
management.security.enabled=false
以上两段代码,起到的作用是一样的。 不过需要注意的是,YAML文件格式需要特别注意。
自定义参数
通过@value(“${xxxx.xxxx}”)加载自定义参数
@value 注解加载属性值的时候,可以支持两种表达方式:
1.PlaceHolder 方式:${......} 大括号内为 PlaceHolder
2.SpEL 表达式: #{......} 大括号内为 SpEL
例:
自定义属性,配置一些常量:
com.sys.name="张三"
com.sys.age=24
然后直接在要是用的地方通过@Value(value="${config.name}")就可以绑定到想要的属性上面:
@RestController
public class userController {
@Value("${com.sys.name}")
private String name;
@Value("${com.sys.age}")
private Integer age;
}
有时候属性太多,一个一个的绑定到属性字段上太累,官方提倡使用绑定为一个对象的属性bean.
例:
我们新建一个ConfigBean.java的类,顶部使用@ConfigurationProperties(prefix = "com.sys")来指明使用的属性前缀:
@ConfigurationProperties(prefix = "com.sys")
public class ConfigBean {
private String name;
private Integer age;
// getter 和setter 一定要有
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
}
在Spring boot入口类加上@EnableConfigurationProperties({ConfigBean.class}) ,指定加载具体bean.
@SpringBootApplication
@EnableConfigurationProperties({ConfigBean.class})
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
使用时,在controller中引入ConfigBean使用即可:
@RestController
public class userController {
// 属性Bean方式
@Autowired
ConfigBean configBean;
}
参数间引用
在application.properties中的各个参数之间也可以直接引用来使用。
例:
com.sys.name="张三"
com.sys.age=12
com.sys.msg=${com.sys.name}今年${com.sys.age}岁
随机值配置
配置文件中${random}可以生成不同的类型的随机值,简化了代码生成的麻烦。
例:
com.sys.number=${random.int}
com.sys.long=${random.long}
com.sys.str=${random.value}
外部配置-命令行参数配置
Spring Boot是基于jar包运行的,打成jar包的程序可以直接通过命令运行: java -jar xx.jar
可以通过命令修改如tomcat端口号等配置 : java -jar xx.jar --server.port=9090
等价于 application.properties 文件中的 server.port=9090
如果怕命令行有风险,可以使用SpringApplication.setAddCommandLineProperties(false)禁用。
自定义配置文件
除了默认的 application.properties ,开发者还可以自行定义配置文件。
例如,我新建了一个test.properties 文件,路径也放在src/main/resources 下
com.test.name="李四"
com.test.age=15
新建一个 属性bean(spring boot 版本 >= 1.5):
@Configuration
@ConfigurationProperties(prefix = "com.test")
@PropertySource("classpath:test.properties")
public class ConfigTestBean {
private String name;
private Integer age;
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
}
如果使用的是1.5之前的版本,可以通过locations指定文件位置
@ConfigurationProperties(prefix = "com.test",locations="classpath:test.properties")
配置属性的优先级
Spring Boot应用程序有多种设置途径,Spring Boot能从多重属性源获得属性,包括如下几种(优先级由高到低,任何在高优先级属性源里设置的属性都会覆盖低优先级的相同属性):
1.根目录下的开发工具全局设置属性(当开发工具激活时为`~/.spring-boot-devtools.properties`)。
2.测试中的@TestPropertySource注解。
3.测试中的@SpringBootTest#properties注解特性。
4.命令行参数
5.SPRING_APPLICATION_JSON中的属性(环境变量或系统属性中的内联JSON嵌入)。
6.ServletConfig初始化参数。
7.ServletContext初始化参数。
8.java:comp/env里的JNDI属性
9.JVM系统属性
10.操作系统环境变量
11.随机生成的带random.* 前缀的属性(在设置其他属性时,可以应用他们,比如${random.long})
12.应用程序以外的application.properties或者appliaction.yml文件
13.打包在应用程序内的application.properties或者appliaction.yml文件
14.通过@PropertySource标注的属性源
15.默认属性(通过`SpringApplication.setDefaultProperties`指定).
配置文件的优先级
application.properties和application.yml文件可以放在一下四个位置(优先级由高到低):
- 外置,在相对于应用程序运行目录的/congfig子目录里。
- 外置,在应用程序运行的目录里
- 内置,在config包内
- 内置,在Classpath根目录
也就是说,src/main/resources/config下application.properties覆盖src/main/resources下application.properties中相同的属性,如图:
此外在相同优先级位置同时有application.properties和application.yml,那么application.yml里面的属性就会覆盖application.properties里的属性。
整合配置属性的优先级 和 配置文件的优先级 后,形成以下在开发过程中需要注意的优先级序列:
- 在命令行中传入的参数
- SPRING_APPLICATION_JSON 中的属性 .SPRING_APPLICATION_JSON 是以json格式配置在系统环境变量中的内容。
- java:comp/env 中的JNDI属性
- Java 的系统属性,可以通过 System.getProperties()获得的内容
- 操作系统的环境变量
- 通过random.*配置的随机属性
- 位于当前应用jar包之外,针对不同{profile}环境的配置文件内容,例如application-{profile}.properties或者是YAML定义的配置文件
- 位于当前应用jar包之内,针对不同{profile}环境的配置文件内容,例如application-{profile}.properties或者是YAML定义的配置文件
- 位于当前应用jar包之外的, 例如application.properties或者是YAML定义的配置文件
- 位于当前应用jar包之内的, 例如application.properties或者是YAML定义的配置文件
- 在@Configuration 注解修改的勒种,通过@PropertySource注解定义的属性
- 应用默认属性,使用SpringApplication.setDefaultProperties定义的内容
多环境配置
application-{profile}.properties 格式
例如:
application-dev.properties 开发环境
application-test.properties 测试环境
application-prod.properties 生产环境
是否加载则由application.properties文件中 spring.profiles.active 属性来设置,其值对应配置文件中的{profile}值。