# 配置文件

SpringBoot 配置文件详解。

# 基本介绍

SpringBoot提供了丰富的外部配置,如

  • 核心配置文件 application.properties/yml
  • 命令行参数
  • OS环境变量
  • Dev属性

其中核心配置文件主要以key-value的形式配置的,key有两种

  1. 默认属性:Spring文档默认属性列表 (opens new window)
  2. 自定义属性

# 属性配置

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
1
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
1
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
1
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  
1
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;
}
1
2
3
4
5
6
7

# 方式二

使用注解@ConfigurationProperties 读取多个属性

使用@ConfigurationProperties会出现警告 加入这个依赖即可

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-configuration-processer</artifactId>
	<optional>true</optional>
</dependency>
1
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 方法
}
1
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 {
}

1
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
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;
    }
} 
1
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;
    
}
1
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);
1
2
3
4

# 方式六

文件IO流读取

# 加载顺序

SpringBoot会按照优先级从高到低加载配置文件 ConfigFileApplicationListener

  1. 项目根目录的config目录:file:./config/
  2. 项目根目录:file:./
  3. 类路径的config目录:classpath:/config/
  4. 类路径:classpath:/(推荐使用)

如果存在多个配置文件,则严格按照优先级进行覆盖,最高者胜出,读取顺序:

  1. config/application.properties(项目根目录中config目录下)
  2. config/application.yml
  3. application.properties(项目根目录下)
  4. application.yml
  5. resources/config/application.properties(项目resources目录中config目录下)
  6. resources/config/application.yml
  7. resources/application.properties(项目的resources目录下)
  8. 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  #测试环境端口
1
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上下文