全局配置文件概述及优先级
全局配置文件能够对一些默认配置值进行修改及自定义配置。
Spring Boot使用一个application.properties或者application.yaml的文件作为全局配置文件
![](https://img.haomeiwen.com/i25737031/e940a619d7449d3d.png)
也可以从ConfigFileApplicationListener这类便可看出,其中DEFAULT_SEARCH_LOCATIONS属性设置
了加载的目录:
–file:./config/
–file:./
–classpath:/config/
–classpath:/
1. 先去项目根目录找config文件夹下找配置文件件
2. 再去根目录下找配置文件
3. 去resources下找cofnig文件夹下找配置文件
4. 去resources下找配置文件
![](https://img.haomeiwen.com/i25737031/97ee6da563f915dd.png)
互补配置
整个设计非常巧妙。SpringBoot会从这四个位置全部加载主配置文件,如果高优先级中配置文件属性与
低优先级配置文件不冲突的属性,则会共同存在— 互补配置 。
SpringBoot会加载全部主配置文件;互补配置;
备注:
这里说的配置文件,都还是项目里面。最终都会被打进jar包里面的,需要注意。
1、如果同一个目录下,有application.yml也有application.properties,默认先读取
application.properties。
2、如果同一个配置属性,在多个配置文件都配置了,默认使用第1个读取到的,后面读取的不覆盖前面读取
到的。
3、创建SpringBoot项目时,一般的配置文件放置在“项目的resources目录下”
自定义配置文件名
如果我们的配置文件名字不叫application.properties或者application.yml,可以通过以下参数来指定
配置文件的名字,myproject是配置文件名
$ java -jar myproject.jar --spring.config.name=demo
我们同时也可以指定其他位置的配置文件来生效
指定配置文件和默认加载的这些配置文件共同起作用形成互补配置。
java -jar run-0.0.1-SNAPSHOT.jar -- spring.config.location=D:/application.properties
补充
Spring Boot 2.4 改进了处理 application.properties 和 application.yml 配置文件的方式,
如果是2.4.0之前版本,优先级properties>yaml
但是如果是2.4.0的版本,优先级yaml>properties
如果想继续使用 Spring Boot 2.3 的配置逻辑,也可以通过在 application.properties 或者
application.yml 配置文件中添加以下参数:
spring.config.use-legacy-processing = true
application.properties配置文件
使用Spring Initializr方式构建Spring Boot项目时,会在resource目录下自动生成一个空的
application.properties文件,Spring Boot项目启动时会自动加载application.properties文件。
(1) 以一个类举例
public class Pet {
private String type;
private String name;
// 省略属性getXX()和setXX()方法
// 省略toString()方法
}
@Component //用于将Person类作为Bean注入到Spring容器中
@ConfigurationProperties(prefix = "person") //将配置文件中以person开头的属性注入到该类 中
public class Person {
private int id; //id
private String name; //名称
private List hobby; //爱好
private String[] family; //家庭成员
private Map map;
private Pet pet; //宠物
// 省略属性getXX()和setXX()方法
// 省略toString()方法
}
@ConfigurationProperties(prefix = "person")注解的作用是将配置文件中以person开头的属性值通过
setXX()方法注入到实体类对应属性中
@Component注解的作用是将当前注入属性值的Person类对象作为Bean组件放到Spring容器中,只有
这样才能被@ConfigurationProperties注解进行赋值
(2)打开项目的resources目录下的application.properties配置文件,在该配置文件中编写需要对
Person类设置的配置属性
![](https://img.haomeiwen.com/i25737031/df1a755d1873f8d4.png)
提示:编写application.properties配置文件时,由于要配置的Person对象属性是我们自定义的,Spring
Boot无法自动识别,所以不会有任何书写提示。在实际开发中,为了出现代码提示的效果来方便配置,
在使用@ConfigurationProperties注解进行配置文件属性值注入时,可以在pom.xml文件中添加一个
Spring Boot提供的配置处理器依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
在pom.xml中添加上述配置依赖后,还需要重新运行项目启动类或者使用“Ctrl+F9”快捷键(即
Build Project)重构当前Spring Boot项目方可生效
application.yaml配置文件
YAML文件格式是Spring Boot支持的一种JSON超集文件格式,以数据为中心,比properties、xml等更
适合做配置文件
yml和xml相比,少了一些结构化的代码,使数据更直接,一目了然
l 相比properties文件更简洁
YAML文件的扩展名可以使用.yml或者.yaml。
application.yml文件使用 “key:(空格)value”格式配置属性,使用缩进控制层级关系。
这里,针对不同数据类型的属性值,介绍一下YAML
(1)value值为普通数据类型(例如数字、字符串、布尔等)
当YAML配置文件中配置的属性值为普通数据类型时,可以直接配置对应的属性值,同时对于字符
串类型的属性值,不需要额外添加引号,示例代码如下
server:
port: 8080
servlet:
context-path: /demo
person:
id: 1
name: lucy
hobby: [吃饭,睡觉,打豆豆]
family: [father,mother]
map: {k1: v1,k2: v2}
pet: {type: dog,name: 旺财}
属性注入
使用Spring Boot全局配置文件设置属性时:
如果配置属性是Spring Boot已有属性,例如服务端口server.port,那么Spring Boot内部会自动扫描并
读取这些配置文件中的属性值并覆盖默认属性。
如果配置的属性是用户自定义属性,例如刚刚自定义的Person实体类属性,还必须在程序中注入这些配
置属性方可生效。
常用注解
@Configuration:声明一个类作为配置类
@Bean:声明在方法上,将方法的返回值加入Bean容器
@Value:属性注入
@ConfigurationProperties(prefix = "jdbc"):批量属性注入
@PropertySource("classpath:/jdbc.properties")指定外部属性文件。在类上添加
@Value("${jdbc.url}")
String url;
@Configuration
@EnableConfigurationProperties(JdbcProperties.class)
@ConfigurationProperties(prefix = "jdbc") //这里需要定义出在application文件中定义属
性值得前缀信息
public class JdbcProperties {
private String url;
private String driverClassName;
private String username;
private String password;
第三方配置
除了 @ConfigurationProperties 用于注释类之外,您还可以在公共 @Bean 方法上使用它。当要将属
性绑定到控件之外的第三方组件时,这样做特别有用
@Data
public class AnotherComponent {
private boolean enabled;
private InetAddress remoteAddress;
}
@Configuration
public class MyService {
@ConfigurationProperties("another")
@Bean
public AnotherComponent anotherComponent(){
return new AnotherComponent();
}
}
another.enabled=true
another.remoteAddress=192.168.10.11
松散绑定
Spring Boot使用一些宽松的规则将环境属性绑定到@ConfigurationProperties bean,因此环境属性名
和bean属性名之间不需要完全匹配
属性文件中配置 | 说明 |
---|---|
acme.my-project.person.first-name | 羊肉串模式case, 推荐使用 |
acme.myProject.person.firstName | 标准驼峰模式 |
acme.my_project.person.first_name | 下划线模式 |
ACME_MYPROJECT_PERSON_FIRSTNAME | 大写下划线,如果使用系统环境时候推荐使用 |
@ConfigurationProperties vs @Value 对比
特征 | @ConfigurationProperties | @Value |
---|---|---|
宽松的绑定 | yes | Limited |
元数据支持 | yes | no |
SpEL 表达式 | no | yes |
应用场景 | 批量属性绑定 | 单个属性绑定 |
(SpEL 表达式 "${xxxx}")
网友评论