# 配置文件
SpringBoot 配置文件详解。
# 基本介绍
SpringBoot提供了丰富的外部配置,如
- 核心配置文件 application.properties/yml
- 命令行参数
- OS环境变量
- Dev属性
其中核心配置文件主要以key-value的形式配置的,key有两种
- 默认属性:Spring文档默认属性列表 (opens new window)
- 自定义属性
# 属性配置
1. 默认属性 在application.properties/yml中添加配置
- 数据源配置(DataSource)
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:XE
spring.datasource.username=admin
spring.datasource.password=admin
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
2
3
4
- 嵌入式容器(Embedded Server)
- Web环境(SpringMVC)
- 日志管理
- MyBatis-Framework
- Redis/MQ等各种主流框架
2. 自定义属性
- 认证信息,socks.identity.*是前缀
socks.identity.number=441881199610245710
socks.identity.name=socks
socks.identity.address=beijing load
2
3
- 随机值,spring.test.*是前缀(RandomValuePropertySource)
spring.test.my-id1=${random.int}
spring.test.my-id2=${random.int(10)}
spring.test.my-id3=${random.int[10,20]}
spring.test.my-id4=${random.long}
spring.test.my-name= ${random.value}
spring.test.my-uuid=${random.uuid} #生成UUID
2
3
4
5
6
# 属性读取
# 方式一
使用@Value读取单个属性,此时,类必须是Spring的bean.@Value支持SpringEL表达式 可以设置默认值 ${spring.datasource.url:}
@Component
public class MyDataSource {
//可以设置默认值
@Value("${spring.datasource.url:}")
private String url;
// 提供Setter 和 Getter 方法
} ccc
2
3
4
5
6
7
8
注意事项:@Value不支持注入静态变量,可间接通过Setter注入来实现。
private static String siteUrl;
@Value("${my.url}")
public void setSiteUrl(String myUrl) {
System.out.println(myUrl);
siteUrl = myUrl;
}
2
3
4
5
6
7
# 方式二
使用注解@ConfigurationProperties 读取多个属性
使用@ConfigurationProperties会出现警告 加入这个依赖即可
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processer</artifactId>
<optional>true</optional>
</dependency>
2
3
4
5
@Component
@ConfigurationProperties(prefix = "spring.datasource")
public class MyDataSource {
private String url;
private String username;
private String password;
private String driverClassName;
// 提供Setter 和 Getter 方法
}
2
3
4
5
6
7
8
9
10
11
12
13
14
@EnableConfigurationProperties和@ConfigurationProperties的区别
@EnableConfigurationProperties可以将使用@ConfigurationProperties注解的配置类注入Spring容器,换句话说@EnableConfigurationProperties和@Component这这里具有相同的作用
@SpringBootApplication
@EnableConfigurationProperties(ServerConfig.class)
public class DemoApplication {
}
//@Component 上面会注入,这里不再使用@Component注解了
@Data
@ConfigurationProperties(prefix = "server")
public class ServerConfig {
}
2
3
4
5
6
7
8
9
10
11
@ConfigurationProperties注解支持宽松绑定,以下都支持,都能识别到
services:
ip-addr: 127.0.0.1
ip_addr: 127.0.0.1
ipAddr: 127.0.0.1
IP_ADDR: 127.0.0.1
2
3
4
5
# 方式三
通过Environment方式获取
@Component
public class MyDataSource {
@Resouce
private Environment env;
public void test() {
String var1 = env.getProperties("my.url")
}
}
// 可以不同更自动注入方式,通过实现接口方式
public class MyEnvironment implate EnvironmentAware {
private Environment env;
@Override
public void setEnvironment(Environment environment) {
this.env = environment;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 方式四
获取自定义的配置文件,比如在resources/db.propertie配置文件
//PropertySources只能获取Properties文件
@Configuration
@PropertySources({
@PropertySource(value = "classpath:db.propertie", encoding="utf-8")
})
public class DBConfigProperties {
@Value("${my.url}")
private String siteUrl;
}
2
3
4
5
6
7
8
9
10
11
# 方式五
自动注入为Resource
@Value("classpath:material/Thymeleaf-Page-Config.json")
private org.springframework.core.io.Resource thymeleafPageConfig;
String pageJSON = IOUtils.toString(thymeleafPageConfig.getInputStream(), StandardCharsets.UTF_8);
2
3
4
# 方式六
文件IO流读取
# 加载顺序
SpringBoot会按照优先级从高到低加载配置文件 ConfigFileApplicationListener
- 项目根目录的config目录:
file:./config/
- 项目根目录:
file:./
- 类路径的config目录:
classpath:/config/
- 类路径:
classpath:/
(推荐使用)
如果存在多个配置文件,则严格按照优先级进行覆盖,最高者胜出,读取顺序:
- config/application.properties(项目根目录中config目录下)
- config/application.yml
- application.properties(项目根目录下)
- application.yml
- resources/config/application.properties(项目resources目录中config目录下)
- resources/config/application.yml
- resources/application.properties(项目的resources目录下)
- resources/application.yml
注:
- 如果同一个目录下,有application.yml也有application.properties,默认先读取application.properties。
- 如果同一个配置属性,在多个配置文件都配置了,默认使用第1个读取到的,后面读取的不覆盖前面读取到的。
- 创建SpringBoot项目时,一般的配置文件放置在项目的resources目录下,因为配置文件的修改,通过热部署不用重新启动项目,而热部署的作用范围是classpath下
如果想修改默认的加载路径 或者 调改默认的配置文件名,我们可以借助命令行参数进行指定
java -jar demo.jar --spring.config.name=app --spring.config.location=file:///D:/application.properties,classpath:/,classpath:/myconfig/
多环境支持(spring.profiles.active)
application.yml 配置如下:
spring:
profiles:
active: test # 选择加载文件application-{test}.yml
application-prod.yml 配置如下:
server:
port: 9001 #生产环境端口
application-test.yml 配置如下:
server:
port: 8081 #测试环境端口
2
3
4
5
6
7
8
9
10
11
12
如果spring.profiles.active指定了多个配置文件,则按顺序加载,其中最后的优先级最高,也就是最后的会覆盖前者
# 命令行参数
启动的时候使用DOS命令:java -jar demo.jar --server.port=8081
,在控制台可看到应用端口变成了8081。
默认情况下,SpringBoot会将这些命令行参数转化成一个 Property ,并将其添加到Environment上下文
← 整合日志Logback 整合定时任务 →