SpringBoot配置加载,各配置文件优先级对比方式

目录
  • 1.SpringBoot配置文件
    • 以设置应用端口为例
  • 2.配置文件目录
  • 3.自定义配置属性
    • 自定义配置提示
  • 4.指定配置文件
    • @PropertySource使用
    • 装配yaml配置文件
    • @ImportResource使用
  • 其他问题
    • idea使用*.properties文件出现中文乱码问题?
    • 解决方法:

1.SpringBoot配置文件

SpringBoot使用一个以application命名的配置文件作为默认的全局配置文件。支持properties后缀结尾的配置文件或者以yml/yaml后缀结尾的YAML的文件配置。

以设置应用端口为例

properties文件示例(application.properties):

server.port=80

YAML文件示例(application.yml):

server:
  port: 80

yaml语法规范这里不多说

两者同时存在情况

假如各配置文件都配置了不同的端口,那么SpringBoot会使用哪一个端口呢?带着疑问试验一下实例

  • 在resources目录下创建两个配置文件,一个为application.yml配置文件,设置端口为8010,另一个为application.properties配置文件,设置端口为8020;
  • 重启系统;
  • 运行结果:

  • 结论:可见在同一目录下,properties配置优先级 > YAML配置优先级。//所以我们在jar包启动时带上properties写法的配置可以覆盖配置

2.配置文件目录

SpringBoot配置文件可以放置在多种路径下,不同路径下的配置优先级有所不同。可放置目录(优先级从高到低)

  • file:./config/ (当前项目路径config目录下);
  • file:./ (当前项目路径下);
  • classpath:/config/ (类路径config目录下);
  • classpath:/ (类路径config下).

优先级由高到底,高优先级的配置会覆盖低优先级的配置

SpringBoot会从这四个位置全部加载配置文件并互补配置

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

private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,file:./config/";

接着getSearchLocations方法中去逗号解析成Set,其中内部类Loader负责这一配置文件的加载过程,包括加载profile指定环境的配置,以application+'-'+name格式的拼接加载

多种目录配置同时存在情况

接下来还是以端口配置为例

  • 在resources/目录下配置文件设置端口为8888;
  • 在resources/config目录下配置文件设置端口为9999;
  • 在项目路径下配置文件设置端口为6666;
  • 在项目路径config目录下配置文件设置端口为7777;

最终运行结果:

Tomcat started on port(s): 7777 (http) with context path '/beedo'

Started BeedoApplication in 4.544 seconds (JVM running for 5.335)

通过控制变量法得以论证

其优先级由高到底,高优先级的配置会覆盖低优先级的配置

3.自定义配置属性

SpringBoot提供了许多的配置,但通常情况我们需要自定义自己的配置应用自己的系统中,如你需要配置一个默认的用户名密码做为系统的登录用。

首先创建一个实体类,作为配置注入用,并使用**@ConfigurationProperties注解进行批量注入, 也可以使用Spring底层注解

@Value("${user.username}")**的方式一个一个注入达到同意的效果

@Component
@ConfigurationProperties(prefix = "user")
public class Login{
    private String username;
    private String password;
    ...
}

或者@Value写法

@Component
public class Login{
    private String username;
    private String password;
    ...
}

配置yaml文件

user:
    username: admin
    password: 123

或者properties文件

login.username=admin
login.password=123

编写一个junit测试用例,看看配置的值是否正常注入:

@RunWith(SpringRunner.class)
@SpringBootTest
public class DeployApplicationTests {
    @Autowired
    private Login login;
    @Test
    public void contextLoads() {
        System.out.println(login);
    }
}

从输出结果上看,值已正常注入

Login{username=‘admin', password=‘123'}

比较项 @ConfigurationProperties @Value
全量注入 支持
松散绑定(Relaxed binding) 支持
SpEL 支持
JSR303 支持 不支持

**松散绑定:**驼峰命名(userName)、横干拼接(user-name)、下划线(user_name)之间可以互相识别绑定称为做松散绑定 **JSR303:**通过@Email,@Nullable,@Digits 等等注解进行邮箱、判空、数字格式等等数据的校验,更多相关内容请参考IBM的中文文档:https://www.ibm.com/developerworks/cn/java/j-lo-jsr303/index.html @ConfigurationProperties通常用于将配置全量注入某个类中; @Value通常用于注入某一些特定配置值中;

自定义配置提示

在编写配置时,你会发现自定义配置没有提示,让你在使用自定义配置时变的很麻烦,其实SpringBoot早已为我们准备好了提示的需要,只需要用引入相关依赖即可有提示。

在没有加入依赖时idea会有如下提示:

添加依赖,该idea提示便消失,编写自定义配置时也有相应提示:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

需要运行一下

4.指定配置文件

通常情况下我们将配置配置在application开头的主配置文件中,这样随着项目的增大配置项的增多会使文件变得非常臃肿,其实SpringBoot早已考虑到了该问题,SpringBoot提供了**@PropertySource@ImportResource**两个注解用于加载外部配置文件使用。

  • @PropertySource通常用于属性加载配置文件,注意@PropertySource注解不支持加载yaml文件,支持properties文件。
  • @ImportResource通常用于加载Spring的xml配置文件

@PropertySource使用

装配properties配置文件

在sources/config下创建一个yaml文件命名为user.properties内容与上方user的配置一样

Login类可如下写法

@PropertySource(value = {"classpath:config/user.properties"})
@Component
@ConfigurationProperties(prefix = "user")
public class Login{
    private String username;
    private String password;
    ...
}

运行一下,同样能达到加载配置效果

同时加载多个配置问题

细心的你,会发现@PropertySource注解中属性value为一个数组,如果同时加载多个配置文件,并且不同配置文件中对同一个属性设置了不同的值,那么Spring会识别哪一个呢?

带着疑问,我们可以通过控制变量法进行测试,具体过程再在赘述。

@PropertySource(value = {"classpath:config/user1.properties","classpath:config/user2.properties"})

结论:Spring加载顺序为从左到右顺序加载,后加载的会覆盖先加载的属性值。

装配yaml配置文件

如果你有强迫症,一定想加载yaml配置文件,那么可以通过PropertySourcesPlaceholderConfigurer类来加载yaml文件,将原来的user.properties改成user.yaml,Bean配置类中加入如下代码,Login配置类和一开始的方式一致。

@Bean
public static PropertySourcesPlaceholderConfigurer loadProperties() {
    PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
    YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
    //yaml.setResources(new FileSystemResource("classpath:config/user.yml"));//File路径引入
    yaml.setResources(new ClassPathResource("config/user.yml"));//class路径引入
    configurer.setProperties(yaml.getObject());
    return configurer;
}

运行一下,仍然可以能达到加载配置效果的

@ImportResource使用

SpringBoot提出零xml的配置,因此SpringBoot默认情况下时不会识别项目中Spring的xml配置文件。为了能够加载xml的配置文件,SpringBoot提供了@ImportResource注解该注解可以加载Spring的xml配置文件,通常加于启动类上。

@ImportResource(value = {"classpath:/beans.xml"})
@SpringBootApplication(scanBasePackages = {"team.seagull.client"})
public class DeployApplication {
    public static void main(String[] args) {
        SpringApplication.run(DeployApplication.class, args);
    }
}

其他问题

idea使用*.properties文件出现中文乱码问题?

idea对*.properties默认编码为GBK,通常我们项目为UTF-8编码,这样程序在读取时就会出现乱码问题;

解决方法:

idea 中 打开如下选项File->Sttings->Editor->FileEncodings

将GBK修改为UTF-8并勾选

Transparent native-to ascill conversion(在运行的时候转换成ascii码)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解Spring Boot 配置加载顺序及属性加载顺序

    先给大家介绍下spring boot 配置加载顺序,具体内容如下所示: 使用 Spring Boot 会涉及到各种各样的配置,如开发.测试.线上就至少 3 套配置信息了.Spring Boot 可以轻松的帮助我们使用相同的代码就能使开发.测试.线上环境使用不同的配置. 在 Spring Boot 里面,可以使用以下几种方式来加载配置.本章内容基于 Spring Boot 2.0 进行详解. 1.properties文件: 2.YAML文件: 3.系统环境变量: 4.命令行参数: 等等-- 我们可

  • 简单了解springboot中的配置文件相关知识

    这篇文章主要介绍了简单了解springboot中的配置文件相关知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 springboot中可以有多个配置文件,配置文件可以是.properties或则yml结尾的文件,并且配置文件有优先级,相同种类的配置application.properties 的优先级比较高,不同种类配置同时都会生效. 也可以自定义配置文件,随意命名,但是后缀名必须按照要求来!后台也可以通过@Value("${key}&quo

  • SpringBoot内部外部配置文件加载顺序解析

    内部配置加载顺序 SpringBoot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件 –file:./config/ –file:./ –classpath:/config/ –classpath:/ 优先级由高到底,高优先级的配置会覆盖低优先级的配置: SpringBoot会从这四个位置全部加载主配置文件:互补配置:还可以通过spring.config.location来改变默认的配置文件位置 项

  • springboot配置文件的加载顺序解析

    这篇文章主要介绍了springboot配置文件的加载顺序解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 springboot启动时会扫描一下位置的application.properties或者application.yml文件作为默认配置文件: file:./config/ file:./ classpath:/config/ classpath:/ 以上是按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级配置会覆盖低优先级配置

  • 简单了解springboot加载配置文件顺序

    1.目录结构 Application属性文件,按优先级排序,位置高的将覆盖位置 当前项目目录下的一个/config子目录 当前项目目录 项目的resources即一个classpath下的/config包 项目的resources即classpath根路径(root) 二.读取顺序 如果在不同的目录中存在多个配置文件,它的读取顺序是: 1.config/application.properties(项目根目录中config目录下) 2.config/application.yml 3.appli

  • SpringBoot配置加载,各配置文件优先级对比方式

    目录 1.SpringBoot配置文件 以设置应用端口为例 2.配置文件目录 3.自定义配置属性 自定义配置提示 4.指定配置文件 @PropertySource使用 装配yaml配置文件 @ImportResource使用 其他问题 idea使用*.properties文件出现中文乱码问题? 解决方法: 1.SpringBoot配置文件 SpringBoot使用一个以application命名的配置文件作为默认的全局配置文件.支持properties后缀结尾的配置文件或者以yml/yaml后缀

  • SpringBoot 配置文件加载位置与优先级问题详解

    [1]项目内部配置文件 spring boot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件 –file:./config/ –file:./ –classpath:/config/ –classpath:/ 即如下图所示: 以上是按照优先级从高到低(1-4)的顺序,所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置内容. SpringBoot会从这四个位置全部加载主配置文件,如果高优先级

  • Springboot自动加载配置的原理解析

    目录 1.springboot自动配置的原理初探 2. 补充扩展(解释为什么引用的包都报红错了,项目还能启动) 3.又一个问题 总结 1.springboot自动配置的原理初探 以下注解都在springboot的自动化配置包中:spring-boot-autoconfigure.读者朋友可以跟着一下步骤走一遍,应该对自动配置就有一定的认知了. 1.springboot程序的入口是在启动类,该类有个关键注解SpringBootApplication @Target(ElementType.TYPE

  • 关于springboot加载yml配置文件的no字段自动转义问题

    目录 加载yml配置文件的no字段自动转义 springboot配置文件自动转译的坑 小结一下 加载yml配置文件的no字段自动转义 项目上线了才发现一个字段被转义了,如下图: 本来应该会拿到no字段和数据进行比对的,结果发现比对完的数据这个字段全是null,debug才发现这个字段这么写在加载yml文件之后自动变成了"false",第一次发现这个问题,修改很方便,把yml文件里面这个no,换成'no'就可以不被转义成"false"了,谨以此提醒,小错误导致临时调整

  • SpringBoot加载读取配置文件过程详细分析

    目录 配置文件的读取顺序 多坏境的配置文件 个性化配置 自定义配置文件名称和路径 加载yml文件 springboot默认读取的配置文件名字是:“application.properties”和“application.yml”,默认读取四个位置的文件:根目录下.根目录的config目录下.classpath目录下.classpath目录里的config目录下: 配置文件的读取顺序 根目录/config/application.properties 根目录/config/application.

  • 浅谈SpringBoot Bean加载优先级的问题

    目录 Bean加载优先级的问题 同一个类中加载顺序 @DependsOn控制顺序 @Order不能控制顺序 Spring控制Bean加载顺序 使用Spring @Order控制bean加载顺序 使用Spring @DependsOn控制bean加载顺序 小结一下 Bean加载优先级的问题 spring容器载入bean顺序是不确定的,spring框架没有约定特定顺序逻辑规范.但spring保证如果A依赖B(如beanA中有@Autowired B的变量),那么B将先于A被加载. 同一个类中加载顺序

  • spring boot启动时加载外部配置文件的方法

    前言 相信很多人选择Spring Boot主要是考虑到它既能兼顾Spring的强大功能,还能实现快速开发的便捷.本文主要给大家介绍了关于spring boot启动时加载外部配置文件的相关内容,下面话不多说了,来随着小编一起学习学习吧. 业务需求: 加载外部配置文件,部署时更改比较方便. 先上代码: @SpringBootApplication public class Application { public static void main(String[] args) throws Exce

  • SpringBoot自定义加载yml实现方式,附源码解读

    目录 自定义加载yml,附源码解读 解决方法 源码解读 如何引入多个yml方法 方案一:无前缀,使用@Value注解 方案二:有前缀,无需@Value注解 自定义加载yml,附源码解读 昨天在对公司的微服务配置文件标准化的过程中,发现将原来的properties文件转为yml文件之后,微服务module中标记有@Configuration的配置类都不能正常工作了,究其原因,是由于@PropertySource属性默认只用于标记并告诉spring boot加载properties类型的文件 spr

  • SpringBoot实现加载yml文件中字典数据

    将字典数据,配置在 yml 文件中,通过加载yml将数据加载到 Map中 Spring Boot 中 yml 配置.引用其它 yml 中的配置.# 在配置文件目录(如:resources)下新建application-xxx 必须以application开头的yml文件, 多个文件用 "," 号分隔,不能换行 项目结构文件 application.yml server: port: 8088 application: name: VipSoft Env Demo spring: pro

随机推荐