SpringBoot读取外部配置文件的方法

 更新时间:2022年02月09日 10:58:15   作者:_再见理想  
这篇文章主要介绍了SpringBoot读取外部配置文件的方法,以端口配置为例,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

1.SpringBoot配置文件

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

以设置应用端口为例

properties文件示例(application.properties):

server.port=80

YAML文件示例(application.yml):

server:
  port: 80

在properties和yml/yaml配置文件同时存在的情况下, 在同一目录下,properties配置优先级 > YAML(YML)配置优先级

2.配置文件目录

SpringBoot配置文件可以放置在多种路径下,不同路径下的配置优先级有所不同。

可放置目录(优先级从高到低)

./config/ (当前项目路径config目录下);
./ (当前项目路径下);
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;
    ...
}

配置文件写法

# yml文件写法
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两种注解对比

比较项@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通常用于注入某一些特定配置值中;

使用@ConfigurationProperties方式可以进行配置文件与实体字段的自动映射,但需要字段必须提供set方法才可以,而使用@Value注解修饰的字段不需要提供set方法

自定义配置提示

在编写配置时,你会发现自定义配置没有提示,让你在使用自定义配置时变的很麻烦,其实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码)

到此这篇关于SpringBoot读取外部配置文件的方法的文章就介绍到这了,更多相关SpringBoot读取外部配置文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot Mybatis-Plus数据库单元测试实战(三种方式)

    Springboot Mybatis-Plus数据库单元测试实战(三种方式)

    这篇文章主要介绍了Springboot Mybatis-Plus数据库单元测试实战(三种方式),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • restTemplate发送get与post请求并且带参数问题

    restTemplate发送get与post请求并且带参数问题

    这篇文章主要介绍了restTemplate发送get与post请求并且带参数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Spring配置文件的拆分和整合过程分析

    Spring配置文件的拆分和整合过程分析

    在实际应用里,随着应用规模的增加,系统中 Bean 数量也大量增加,导致配置文件非常庞大。为了避免这种情况的产生,提高配置文件的可读性与可维护性,可以将Spring 配置文件分解成多个配置文件,感兴趣的朋友跟随小编一起看看吧
    2022-10-10
  • Java递归算法简单示例两则

    Java递归算法简单示例两则

    这篇文章主要介绍了Java递归算法,通过两则示例分析了Java递归算法实现阶乘与求和的具体操作技巧,需要的朋友可以参考下
    2017-09-09
  • Java中seata框架的XA模式详解

    Java中seata框架的XA模式详解

    这篇文章主要介绍了Java中seata框架的XA模式详解,Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务,Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案,需要的朋友可以参考下
    2023-08-08
  • java对接Modbus协议代码示例

    java对接Modbus协议代码示例

    Modbus是一种串行通信协议,Modbus已经成为工业领域通信协议的业界标准,并且现在是工业电子设备之间常用的连接方式,这篇文章主要给大家介绍了关于java对接Modbus协议的相关资料,需要的朋友可以参考下
    2024-03-03
  • Spring事务原理解析

    Spring事务原理解析

    Spring事务有可能会提交,回滚、挂起、恢复,所以Spring事务提供了一种机制,可以让程序员来监听当前Spring事务所处于的状态,这篇文章主要介绍了Spring底层事务原理,需要的朋友可以参考下
    2022-12-12
  • MyBatis-Plus中使用EntityWrappe进行列表数据倒序设置方式

    MyBatis-Plus中使用EntityWrappe进行列表数据倒序设置方式

    这篇文章主要介绍了MyBatis-Plus中使用EntityWrappe进行列表数据倒序设置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • SpringBoot整合Mybatis实现CRUD

    SpringBoot整合Mybatis实现CRUD

    这篇文章主要介绍了SpringBoot整合Mybatis实现CRUD的相关知识,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • SpringBoot常用注解@RestControllerAdvice详解

    SpringBoot常用注解@RestControllerAdvice详解

    这篇文章主要介绍了SpringBoot常用注解@RestControllerAdvice详解,@RestControllerAdvice是一个组合注解,由@ControllerAdvice、@ResponseBody组成,而@ControllerAdvice继承了@Component,因此@RestControllerAdvice本质上是个Component,需要的朋友可以参考下
    2024-01-01

最新评论