SpringBoot读取配置文件中的内容

这篇具有很好参考价值的文章主要介绍了SpringBoot读取配置文件中的内容。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

配置文件application.yml:

server:
  port: 8001
blog:
  user: 
    name: xinliushijian
    home: 徐州
    work: 上海
    marathonpb: 419

1. 读取配置文件application.yml中内容的方法

1.1 Environment

  • Environment 是 springboot 核心的环境配置接口,它提供了简单的方法来访问应用程序属性,包括系统属性、操作系统环境变量、命令行参数、和应用程序配置文件中定义的属性等等。

  • Springboot 程序启动加载流程里,会执行SpringApplication.run中的prepareEnvironment()方法进行配置的初始化

  • 使用 Environment 方式来获取配置属性值非常简单,只要注入Environment类调用其方法getProperty(属性key)即可

示例代码:

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.env.Environment;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;

import static org.junit.jupiter.api.Assertions.assertEquals;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = XinJavaDemoApplication.class)
@Slf4j
public class EnvironmentTest {

    @Resource
    private Environment env;

    @Test
    public void test1() {
        String port = env.getProperty("server.port");
        System.out.println("port: " + port);
        assertEquals(port, "8001");
    }

    @Test
    public void test2() {
        String home = env.getProperty("blog.user.home");
        System.out.println("blog.user.home: " + home);
        assertEquals(home, "徐州");
    }
    
}

key不存在时,执行不会报错,value为null

SpringBoot读取配置文件中的内容,Spring,spring boot,java,spring

1.2 @Value注解

  • @Value注解是Spring框架提供的用于注入配置属性值的注解,它可用于类的成员变量、方法参数和构造函数参数上,这个记住很重要!

  • 在应用程序启动时,使用 @Value 注解的 Bean 会被实例化。所有使用了 @Value 注解的 Bean 会被加入到 PropertySourcesPlaceholderConfigurer 的后置处理器集合中。

  • 当后置处理器开始执行时,它会读取 Bean 中所有 @Value 注解所标注的值,并通过反射将解析后的属性值赋值给标有 @Value 注解的成员变量、方法参数和构造函数参数。

  • 需要注意,在使用 @Value 注解时需要确保注入的属性值已经加载到 Spring 容器中,否则会导致注入失败。

  • 只有标注了@Component、@Service、@Controller、@Repository 或 @Configuration 等容器管理注解的类,由 Spring 管理的 bean 中使用 @Value注解才会生效。而对于普通的POJO类,则无法使用 @Value注解进行属性注入。

  • 如果我们想要获取 TestService 类中的某个变量的属性值,需要使用依赖注入的方式,而不能使用 new 的方式。通过依赖注入的方式创建 TestService 对象,Spring 会在创建对象时将对象所需的属性值注入到其中。

key不存在时,执行会报错:

SpringBoot读取配置文件中的内容,Spring,spring boot,java,spring

key不存在时,给出默认值,执行不会报错,结果就是取默认值:

SpringBoot读取配置文件中的内容,Spring,spring boot,java,spring

示例代码:

    @Value("${blog.user.homeeeee:徐州}")
    private String home;

    @Test
    public void testValue() {

        System.out.println("home: " + home);
        assertEquals("徐州", home);
    }

正常取值:

SpringBoot读取配置文件中的内容,Spring,spring boot,java,spring

1.3 @ConfigurationProperties 注解

@ConfigurationProperties注解是 SpringBoot 提供的一种更加便捷来处理配置文件中的属性值的方式,可以通过自动绑定和类型转换等机制,将指定前缀的属性集合自动绑定到一个Bean对象上

加载原理:

  • 在 Springboot 启动流程加载配置的 prepareEnvironment() 方法中,有一个重要的步骤方法 bindToSpringApplication(environment),它的作用是将配置文件中的属性值绑定到被 @ConfigurationProperties 注解标记的 Bean对象中。但此时这些对象还没有被 Spring 容器管理,因此无法完成属性的自动注入。

  • 那么这些Bean对象又是什么时候被注册到 Spring 容器中的呢?

  • 这就涉及到了 ConfigurationPropertiesBindingPostProcessor 类,它是 Bean后置处理器,负责扫描容器中所有被 @ConfigurationProperties 注解所标记的 Bean对象。如果找到了,则会使用 Binder 组件将外部属性的值绑定到它们身上,从而实现自动注入。

创建配置类,prefix + 属性名 = 配置key

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Data
@Configuration
@ConfigurationProperties(prefix = "blog.user")
public class BlogUser {
    private String name;

    private String home;

    private String work;

    private String marathon;

    private String nameeeee;
}

示例代码:

    @Resource
    private BlogUser blogUser;

    @Test
    public void testConfig() {

        System.out.println("blogUser: " + JSONObject.toJSONString(blogUser));
        System.out.println("nameeeee: " + blogUser.getNameeeee());
    }

属性名在配置文件中不存在时,获取此属性值的时候,执行不会报错,结果为null

SpringBoot读取配置文件中的内容,Spring,spring boot,java,spring

1.4 @PropertySources 注解,获取自定义配置文件中的内容,yml文件需要自行实现适配器

  • 除了系统默认的 application.yml 或者 application.properties 文件外,我们还可能需要使用自定义的配置文件来实现更加灵活和个性化的配置。与默认的配置文件不同的是,自定义的配置文件无法被应用自动加载,需要我们手动指定加载。

  • @PropertySources 注解的实现原理相对简单,应用程序启动时扫描所有被该注解标注的类,获取到注解中指定自定义配置文件的路径,将指定路径下的配置文件内容加载到 Environment 中,这样可以通过 @Value 注解或 Environment.getProperty() 方法来获取其中定义的属性值了。

  • 当加载.yaml文件时,启动项目居然报错了,经过一番摸索我发现,@PropertySources 注解只内置了PropertySourceFactory适配器。也就是说它只能加载.properties文件。

  • 如果想要加载一个.yaml类型文件,则需要自行实现yaml的适配器 YamlPropertySourceFactory

  • 而在加载配置时要显示的指定使用 YamlPropertySourceFactory适配器,这样就完成了@PropertySource注解加载 yaml 文件。

支持.properties文件,若是.yml文件则自行实现yaml的适配器,否则识别不了,@Value注解中没给默认值启动时就会报错

增加自定义配置文件

xinliushijian.properties:

blog.user.name=心流时间
blog.user.home=徐州
blog.user.work=上海
blog.user.marathon: 419

xinliu.yml:

new:
  year: 2024
  month: 01
  day: 04

其中用到的@Value注解,在key不存在时报错(启动时)

SpringBoot读取配置文件中的内容,Spring,spring boot,java,spring

在@Value注解中加上默认值,执行就不报错了

SpringBoot读取配置文件中的内容,Spring,spring boot,java,spring

不通过bean,通过new 构造器的方法得到对象获得属性值,执行不报错,结果为null

SpringBoot读取配置文件中的内容,Spring,spring boot,java,spring

xinliu.yml文件中的内容识别不到,启动时就会报错,需要自行实现yaml的适配器

SpringBoot读取配置文件中的内容,Spring,spring boot,java,spring

配置类示例代码

import lombok.Data;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.annotation.PropertySources;
import org.springframework.beans.factory.annotation.Value;

@Data
@Configuration
@PropertySources({
        @PropertySource(value = "classpath:xinliushijian.properties",encoding = "utf-8"),
        @PropertySource(value = "classpath:xinliu.yml",encoding = "utf-8",factory = YamlPropertySourceFactory.class)
})
public class PropertySourcesConf {

    @Value("${blog.user.home:xuzhou}")
    private String home;

    @Value("${blog.user.nameeee:xinliushijian}")
    private String name;

    @Value("${new.year:2023}")
    private String year;
    
}

yaml适配器示例代码:

import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.core.io.support.PropertySourceFactory;

import java.io.IOException;
import java.util.Properties;

public class YamlPropertySourceFactory implements PropertySourceFactory {

    @Override
    public PropertySource<?> createPropertySource(String name, EncodedResource encodedResource) throws IOException {
        YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
        factory.setResources(encodedResource.getResource());

        Properties properties = factory.getObject();

        return new PropertiesPropertySource(encodedResource.getResource().getFilename(), properties);
    }
}

测试类示例代码:

	@Autowired
    private PropertySourcesConf propertySourcesConf;

    @Test
    public void testProp() {
        System.out.println("propertySourcesConf: " + JSONObject.toJSONString(propertySourcesConf));
        System.out.println("nameeeee: " + propertySourcesConf.getName());
        System.out.println("year: " + propertySourcesConf.getYear());
    }

1.5 YamlPropertiesFactoryBean 加载 YAML 文件

我们可以使用 YamlPropertiesFactoryBean 类将 YAML 配置文件中的属性值注入到 Bean 中。

配置类

import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.io.ClassPathResource;

import java.util.Objects;

@Configuration
public class MyYamlConfig {

    @Bean
    public static PropertySourcesPlaceholderConfigurer yamlConfigurer() {
        PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
        YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
        yaml.setResources(new ClassPathResource("xinliu.yml"));
        configurer.setProperties(Objects.requireNonNull(yaml.getObject()));
        return configurer;
    }
}

可以通过 @Value 注解或 Environment.getProperty() 方法来获取其中定义的属性值。

SpringBoot读取配置文件中的内容,Spring,spring boot,java,spring

1.6 各种方式总结

  • 我们可以通过 @Value 注解、Environment 类、@ConfigurationProperties 注解、@PropertySource 注解等方式来获取配置信息。

  • 其中,@Value 注解适用于单个值的注入,而其他几种方式适用于批量配置的注入。不同的方式在效率、灵活性、易用性等方面存在差异,在选择配置获取方式时,还需要考虑个人编程习惯和业务需求。

  • 如果重视代码的可读性和可维护性,则可以选择使用 @ConfigurationProperties 注解;如果更注重运行效率,则可以选择使用 Environment 类。总之,不同的场景需要选择不同的方式,以达到最优的效果。

2. 自定义的配置文件,如果不使用配置类加载,即使放在resources目录下也是获取不到内容的

自定义文件:xinliushijianhaha.yml

newnew:
  year: 2024
  month: 01
  day: 04

测试结果:
SpringBoot读取配置文件中的内容,Spring,spring boot,java,spring

3. 如果两个文件的key重复了,以默认配置文件application.yml中的内容为准

application.yml中的配置:

SpringBoot读取配置文件中的内容,Spring,spring boot,java,spring

自定义配置文件(有用配置类自动加载)xinliu.yml:

SpringBoot读取配置文件中的内容,Spring,spring boot,java,spring

测试结果:

SpringBoot读取配置文件中的内容,Spring,spring boot,java,spring

结果分析:

  • application.yml这种默认的配置文件中的key和自定义配置文件中的key相等时,以application.yml中的内容为准
  • 当配置内容是数字时,前面的0会消失(value是04,得到的结果是4,自动减去了0)

引用文章来源地址https://www.toymoban.com/news/detail-810257.html

到了这里,关于SpringBoot读取配置文件中的内容的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【微服务】spring读取配置文件多种方式深入详解

    目录 一、前言 二、java配置文件介绍 2.1 java配置文件产生原因 2.2 项目使用配置文件好处 2.3 springboot项目配置文件的必要性 2.4 微服务架构下配置文件使用场景 三、java读取配置文件常用方法 3.1 使用Properties类读取配置文件 3.1.1 使用getResourceAsStream读取 3.1.2 使用getClassLoader读取

    2024年04月22日
    浏览(46)
  • 【Spring】1、Spring 框架的基本使用【读取配置文件、IoC、依赖注入的几种方式、FactoryBean】

    Spring 框架可以说是 Java 开发中最重要的框架,功能 非常 强大 中文文档:https://springdoc.cn/spring/ 官网:https://spring.io/ Spring makes Java Simple、modern、productive … Spring 框架的几个核心概念: IoC: I nversion o f C ontrol:控制反转 DI: D ependency I njection:依赖注入 AOP: A spect O riented P rogram

    2024年02月09日
    浏览(33)
  • SpringBoot中的yml文件中读取自定义配置信息

    开发中遇到的问题,百度的答案我都没有找到,去找大佬获取到的经验总结,这只是其中的一种方法,如果其他大佬有新的方法,可以分享分享。 1.1 yml文件 自定义配置信息,通过我们编写的代码读取。 1.2 类 非静态属性中@Value生效 ps: 不是在控制层中拥有@Controller注解,说明

    2024年02月07日
    浏览(45)
  • 【Spring】SpringBoot 配置文件

    配置文件是一种文本文件,通常用于存储程序的参数和设置。它包含了程序运行所需的各种选项和配置信息,例如界面风格、服务器连接信息、默认语言等。这些信息可以通过键值对的形式表示,也可以使用特定的语法和结构描述更复杂的配置信息。 配置文件通常由程序在启

    2024年02月04日
    浏览(32)
  • 【JavaEE & Spring】SpringBoot 配置文件

    计算机上有数以千计的配置文件, 使用软件和硬件等都需要有配置文件,在C盘中存在; 配置文件主要是为了解决硬编码带来的问题,把可能发生改变的信息,放在一个集中的地方,当我们启动某个程序时,应用程序从配置文件中读取数据,并加载运行。 SpringBoot 支持并定义了

    2024年01月21日
    浏览(36)
  • 【Spring教程十】Spring框架实战:全面深入详解IOC/DI之--纯注解开发模式下的依赖注入&&注解读取properties配置文件

    欢迎大家回到《 Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《 如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》,本文的上一篇为《 全面深入详解IOC/DI注解开发》 Spring为了使用注解简化开发,并没有提供

    2024年02月04日
    浏览(44)
  • 【Spring框架全系列】SpringBoot配置日志文件

    🍧🍧哈喽,大家好,我是小浪。那么上篇博客我们学习了SpringBoot配置文件的相关操作,本篇博客我们将学习一个新的知识点,SpringBoot日志文件。🖥🖥 📲目录 一、日志是什么,有什么作用? 二、如何看到日志文件? 三、如何自定义日志打印 1、在程序中得到⽇志对象 2、使

    2024年02月03日
    浏览(54)
  • 【Spring框架全系列】SpringBoot配置文件相关操作

    🌇哈喽,大家好,我是小浪。上篇博客我们已经学习了如何创建一个Spring项目,那么创建Spirng项目还可以直接通过在Spring官网的方式来创建,做法也非常的简单,感兴趣的小伙伴可以在C站搜个教程尝试一下;那么,今天我们就来学习SpringBoot如何配置文件;💡💡 📲目录 一

    2024年02月05日
    浏览(37)
  • 详解 Spring Boot 项目中的配置文件

    🎉🎉🎉 点进来你就是我的人了 博主主页: 🙈🙈🙈 戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔 🤺🤺🤺 目录 1. Spring Boot 项目中配日文件的作用是什么 2. Spring Boot 配置文件的两种格式 1. properties的语法 2. yml的语法 3. properties与yml的对比 4. 设置不同环境下的配

    2024年02月08日
    浏览(39)
  • 解析Spring Boot中的Profile:配置文件与代码的双重掌控

    基于 Spring Boot 创建 Web 应用程序的方法有很多,我们选择在idea中直接进行创建,服务器URL选择Spring Initializer 网站,类型选择Maven项目,java版本根据jdk版本进行选择。 然后添加相应依赖以及选择spring boot版本 接下来我们写一个Controller 现在我们需要对这个应用程序进行打包,使

    2024年02月09日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包