美文网首页SpringBoot
SpringBoot全局配置文件

SpringBoot全局配置文件

作者: GavinZZW | 来源:发表于2021-03-08 11:09 被阅读0次

全局配置文件概述及优先级

全局配置文件能够对一些默认配置值进行修改及自定义配置。
Spring Boot使用一个application.properties或者application.yaml的文件作为全局配置文件


image.png

也可以从ConfigFileApplicationListener这类便可看出,其中DEFAULT_SEARCH_LOCATIONS属性设置
了加载的目录:

–file:./config/ 
–file:./ 
–classpath:/config/ 
–classpath:/
1. 先去项目根目录找config文件夹下找配置文件件
2. 再去根目录下找配置文件
3. 去resources下找cofnig文件夹下找配置文件
4. 去resources下找配置文件
image.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类设置的配置属性


image.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}")

相关文章

网友评论

    本文标题:SpringBoot全局配置文件

    本文链接:https://www.haomeiwen.com/subject/ebxyqltx.html