springboot配置

访问命令行属性

默认情况下,SpringApplication将任何命令行选项参数(即以–开头的参数,例如–server.port=9000)转换为property并将它们添加到 Spring Environment。如前所述,命令行属性始终优先于基于文件的属性源。

如果不想将命令行属性添加到Environment,则可以使用SpringApplication.setAddCommandLineProperties(false)禁用。

java -jar demo.jar –server.port=8080

配置文件

当应用程序启动时, SpringBoot 将自动从以下位置查找并加载文件application.properties,application.yaml

  1. 类路径
  2. 类路径/config目录
  3. jar包所在目录
  4. jar包所在目录/config目录下
  5. jar包所在目录/config目录下的子目录(如果子目录有多个,按照unicode编码排序)

该列表按优先级排序(优先级较低的项目的值将覆盖优先级较高的项目)。加载文件中的属性将添加到Environment。

参考ConfigDataEnvironment#DEFAULT_SEARCH_LOCATIONS

  • spring.config.name 默认为application。即默认加载application.properties,application.yml
  • spring.config.location默认为以上5个路径,只能是目录,所以都以/结尾
  • spring.config.additional-location和spring.config.location差不多,location是默认的配置文件路径,如果想加载其他配置文件路径则使用这个,但是他会覆盖location中的属性

使用yml配置文件

1
2
3
4
5
server:
port: 9000

app:
name: "MyApp"

占位符

1
2
3
my:
# 使用${}
name: "hello ${app.name}"

随机数

1
2
3
4
5
6
7
my:
secret: ${random.value}
number: ${random.int}
bignumber: ${random.long}
uuid: ${random.uuid}
number-less-than-ten: ${random.int(10)}
number-in-range: ${random.int[1024,65536]}

激活属性

可以使用spring.profiles.active属性来指定哪些配置文件处于活动状态。
即加载 {spring.application.name}-{spring.profiles.active}.properties,{spring.application.name}-{spring.profiles.active}.yml

1
2
3
spring:
profiles:
active: dev,test

添加活动配置文件

有时需要将属性添加到活动配置文件而不是替换它们,例如开发环境和测试环境使用的是相同的数据库,即使spring.profiles.active没有激活,公共文件也会激活。即加载{spring.application.name}-{spring.profiles.include}.properties,{spring.application.name}-{spring.profiles.include}.yml

1
2
3
spring:
profiles:
include: test-db

获取属性

JavaBean属性绑定

1
2
3
4
5
6
7
8
9
app:
name: MyApp
age: 18
list:
- a
- b
map:
a: a
b: b

使用@ConfigurationProperties与属性绑定

1
2
3
4
5
6
7
8
@ConfigurationProperties("app")
public class App {
private String name;
private Integer age;
private List<String> list;
private Map<String, String> map;
// getter setter ...
}

使用@EnableConfigurationProperties启用@ConfigurationProperties。
也可以直接在@ConfigurationProperties上添加@Component等注解直接生效。

1
2
3
4
5
6
7
@Configuration
@EnableConfigurationProperties(App.class)
public class AppConfiguration {

@Autowired
App app;
}

@Value

// 无默认值
@Value("${app.name}")
private String name;
// 有默认值,如果配置文件中没有属性则默认使用
@Value("${app.name:'hello'}")
private String name;