SpringBoot中读取配置的七种方法总结

news2024/11/24 19:05:33
❃博主首页 : 「码到三十五」 ,同名公众号 :「码到三十五」,wx号 : 「liwu0213」
☠博主专栏 : <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关>
♝博主的话 : 搬的每块砖,皆为峰峦之基;公众号搜索「码到三十五」关注这个爱发技术干货的coder,一起筑基

在Spring Boot应用中,读取配置是一项基础且重要的任务。Spring Boot提供了多种灵活的方式来读取配置,以满足不同场景下的需求。本文将详细介绍Spring Boot中读取配置的几种常用方法.

文章目录

      • 1. 使用`@Value`注解
      • 2. 使用`ConfigurationProperties`注解
      • 3. 使用`Environment`对象
      • 4. 使用`@PropertySource`注解
      • 5. 自定义配置文件读取
      • 6. 使用命令行参数
      • 7. 使用Spring Expression Language (SpEL)
      • 结论

1. 使用@Value注解

@Value注解是最直接且常用的读取配置的方式。它可以将配置文件中的属性值注入到Spring管理的Bean的字段中。

@Component
public class MyBean {
    @Value("${some.key1}")
    private String someKey1;

     @Value("${some.key2:defaultVal}")
    private String someKey2;

    public void initSomeKey3(@Value("${some.key3}")String key){
        ...
    }
}
  • @Value注解只能读取单个配置进行赋值,无法读取整个配置文件批量赋值
  • 可以在属性名称后面使用冒号(:default-value)的形式添加默认值
  • 只能用于被Spring管理的Bean中使用,或Java配置@Configuration类
  • 可以用于字段、构造函数参数、方法参数和方法上。当将它放在方法上时,Spring容器初始化时会调用该方法,并将配置属性的值作为方法的参数传递进去.

2. 使用ConfigurationProperties注解

ConfigurationProperties注解允许将配置文件的属性绑定到一个Bean上,这样可以更方便地管理和使用配置信息。与@Value注解相比,ConfigurationProperties支持复杂类型的配置,如列表、集合等。

@Component
@ConfigurationProperties(prefix = "some")
public class SomeProperties {
    private String key;
    private List<String> values;

    // ... getters and setters
}

@ConfigurationProperties使用注意事项:

  1. 配置文件属性名与类字段名的映射规则

    • 默认情况下,@ConfigurationProperties会将配置文件中的属性名与类字段名进行映射。例如,配置文件中的student.name会自动映射到类字段name上。
    • 如果配置文件中的属性名与类字段名不一致,可以使用@Value注解或通过setter方法来指定映射关系。
  2. 支持类型转换
    @ConfigurationProperties支持自动类型转换,能够将配置文件中的字符串值转换为目标字段的类型。例如,将字符串转换为整数、布尔值等。如果无法进行类型转换,会抛出异常。

  3. 默认值和可选属性

    • 可以为@ConfigurationProperties注解的字段设置默认值,以防止配置文件中缺少对应的属性。可以使用":"符号指定默认值,例如@Value("${my.property:default-value}")
    • 另外,可以使用required属性来指定某个属性是否为必需的。
  4. 配置项的验证和校验
    可以使用JSR-303/349规范的注解对@ConfigurationProperties注解的字段进行验证和校验。例如,使用@NotBlank、@Min、@Max等注解来限制属性值的有效性。

3. 使用Environment对象

Environment对象提供了访问配置信息的方法。可以通过注入Environment对象来获取配置属性值。

@Component
public class MyBean {
    private final Environment environment;

    @Autowired
    public MyBean(Environment environment) {
        this.environment = environment;
    }

    public void someMethod() {
        String someKey = environment.getProperty("some.key");
        // ...
    }
}

// 通过获取Environment 
@Component
public class MyEnvironmentAware implements EnvironmentAware {

    private Environment env;
    
    @Override
    public void setEnvironment(Environment environment) {
        this.env = environment;
    }

    public String getKey() {
        return env.getProperty("some.key");
    }
}

4. 使用@PropertySource注解

@PropertySource注解允许指定额外的属性文件作为配置源。这对于读取非application.propertiesapplication.yml文件中的配置非常有用。

/**
 * 绑定自定义properties配置
*/
@Data
@Configuration
@PropertySource("classpath:custom.properties")
public class MyPropertiesComponent {
    @Value("${some.key}")
    private String someKey;

    // ...
}

5. 自定义配置文件读取

在某些情况下,需要读取非标准的配置文件(如JSON、XML等)。这时,可以通过编写自定义的配置文件读取逻辑来实现。例如,使用Jackson库来读取JSON配置文件。

@Service
public class ConfigService {
    private MyConfig config;

    @PostConstruct
    public void init() throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        InputStream inputStream = new ClassPathResource("config.json").getInputStream();
        this.config = mapper.readValue(inputStream, MyConfig.class);
    }

    // ... 使用config的方法
}

6. 使用命令行参数

Spring Boot应用也支持通过命令行参数来传递配置信息。可以通过实现CommandLineRunner接口来访问命令行参数。

import org.springframework.boot.CommandLineRunner;  
import org.springframework.stereotype.Component;  
  
@Component  
public class CommandLineAppStartupRunner implements CommandLineRunner {  
  
    @Override  
    public void run(String... args) throws Exception {  
        if (args.length > 0) {  
            System.out.println("接收到命令行参数:");  
            for (String arg : args) {  
                System.out.println(arg);  
            }  
        } else {  
            System.out.println("没有接收到命令行参数。");  
        }  
    }  
}

打包并运行Spring Boot应用。在运行时通过命令行传递参数。

java -jar your-spring-boot-app.jar arg1 arg2 arg3

arg1、arg2和arg3是作为命令行参数传递给应用的.

7. 使用Spring Expression Language (SpEL)

SpEL可以在@Value注解中使用,以更复杂的表达式形式来读取配置值。例如,可以结合系统属性或环境变量来动态获取配置。

@Value("#{systemProperties['some.key'] ?: 'default'}")
private String someKey;

结论

Spring Boot提供了多种灵活且强大的方式来读取配置信息。开发者可以根据具体需求和场景选择最适合的方法来管理和使用配置。无论是简单的键值对还是复杂的配置结构,Spring Boot都能提供相应的支持来简化配置读取的过程。


关注公众号[码到三十五]获取更多技术干货 !

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1986370.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python | TypeError: unsupported operand type(s) for +=: ‘int’ and ‘str’

Python | TypeError: unsupported operand type(s) for : ‘int’ and ‘str’&#xff1a;深度解析 在Python编程中&#xff0c;遇到“TypeError: unsupported operand type(s) for : ‘int’ and ‘str’”这类错误通常意味着你尝试将一个整数&#xff08;int&#xff09;和…

基于OpenCV+MFC的视频读取与对象跟踪平台

基于OpenCVMFC的视频读取与对象跟踪平台 引言一、软件功能简介二、各个功能介绍1、视频操作模块功能介绍1.1打开视频1.2打开摄像头1.3开始录制1.4结束录制1.5暂停1.6恢复1.7关闭1.8还原 2、对象跟踪模块功能介绍2.1 BSM跟踪2.2 颜色跟踪2.3 光流跟踪2.4 KCF多对象跟踪 资源链接…

干货 | 2024步入数字化转型深水区,云原生业务稳定性如何保障(免费下载)

云原生业务的稳定性保障是一个涉及多个层面的复杂任务&#xff0c;以下是一些关键措施和策略&#xff0c;以确保云原生业务的高效稳定运行&#xff1a; 一、平台安全性评估与加固 云原生平台安全评估&#xff1a;对云原生平台&#xff08;如Kubernetes、Docker等&#xff09;…

数学建模--智能算法之鱼群算法

目录 核心原理 应用与实现 实现步骤 性能分析与改进 鱼群算法在解决哪些具体优化问题方面表现最佳&#xff1f; 如何根据不同的应用场景调整鱼群算法的参数设置以提高其性能&#xff1f; 鱼群算法与其他群体智能优化算法&#xff08;如遗传算法、粒子群优化&#xff09;…

鸿道Intewell工业操作系统ARM平台生态:飞腾E2000Q

在这个智能制造和工业自动化的新时代&#xff0c;工业操作系统不仅是技术进步的推动者&#xff0c;更是企业转型升级的加速器。随着全球工业的快速发展&#xff0c;对于能够适应复杂工业环境、满足多样化生产需求的工业操作系统的需求愈发迫切。 鸿道Intewell工业操作系统ARM…

【Java 第七篇章】异常处理

一、简介 Java 异常&#xff08;Exception&#xff09;是 Java 提供的一种用于处理程序中错误情况的机制。当 Java 程序运行时遇到无法继续执行的情况&#xff08;如数组越界、空指针引用等&#xff09;&#xff0c;就会抛出&#xff08;throw&#xff09;一个异常。异常处理是…

【书生大模型实战营第三期】入门岛 第2关 Python基础知识

1. 闯关任务 1 任务描述&#xff1a;实现一个 wordcount 函数&#xff0c;统计英文字符串中每个单词出现的次数。返回一个字典&#xff0c;key 为单词&#xff0c;value 为对应单词出现的次数。 上面是作者编写的代码&#xff0c;运行结果如下。 2. 闯关任务 2 任务描述&#x…

有限元和稀疏矩阵

对于大规模的有限元计算&#xff0c;系统的整体刚度矩阵是非常耗费内存的&#xff0c;以百万自由度为例&#xff0c;刚度矩阵K的大小为100万x100万&#xff0c;元素大小为双精度double&#xff0c;占用8 byte&#xff0c;那么K占用的内存为100万x100万x8 byte 8000G&#xff0…

【模版进阶】

模版进阶 小杨 一、非类型模版参数 模板参数分为类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可…

mysql数据库触发器同步数据

首先检查数据源库是否支持触发器&#xff0c;show ENGINES&#xff0c;如果FEDERATED是NO&#xff0c;表示未开启&#xff0c;如需开启&#xff0c;再mysql配置文件中&#xff0c;添加federated配置到mysqld下面。 一、同服务器不同库触发器同步&#xff0c;这里只举例插入数据…

【用Java学习数据结构系列】探索Java集合框架的无尽秘密pro

看到这句话的时候证明&#xff1a;此刻你我都在努力 加油陌生人 个人主页&#xff1a;Gu Gu Study专栏&#xff1a;用Java学习数据结构系列 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者&#xff…

修改SpringBoot启动图标banner

方式一: 将图标文件命名为banner放在resources目录下 文本文件banner 图片banner 方式二&#xff1a;通过配置文件指定图标路径 指定文本图标&#xff1a;spring.banner.locationclasspath:相对于resources下的位置 ("classpath:"可以省略) 指定图片作为图标: sprin…

C语言——扫雷游戏

扫雷游戏通常是一个由方格组成的区域内进行的&#xff0c;其中随机分布着一定数量的地雷 。玩家的目标是通过点击方格来标记出所有地雷的位置&#xff0c;同时避免自己点到地雷而导致游戏失败。游戏开始时&#xff0c;玩家通常只能看到一部分方格&#xff0c;而其余的方格则需要…

消息框:tkinter.messagebox

文章目录 一、tkinter 简介二、tkinter 基础&#xff08;部件 布局管理器&#xff09;三、项目实战3.1、主循环&#xff1a;root.mainloop()3.2、手动摧毁窗口&#xff1a;root.destroy()3.3、布局管理器&#xff1a;pack3.4、布局管理器&#xff1a;grid3.5、布局管理器&…

【ML】transform 之 decoder 及其实现细节

【ML】transform 之 decoder 及其实现细节 1. decoder2. encoder 和decoder 之间是如何处理和传递讯息的&#xff1f;self-attention3. 查询&#xff08;Query&#xff09;、键&#xff08;Key&#xff09;、值&#xff08;Value&#xff09;是三个核心概念及其具体含义和计算方…

轻松应对大量订单:快递批量查询软件大揭秘

在日常生活和工作中&#xff0c;我们经常会遇到需要查询多个快递单号物流信息的情况&#xff0c;无论是电商卖家需要跟踪大量订单&#xff0c;还是消费者想要及时了解自己包裹的运输状态&#xff0c;手动逐一查询都显得既繁琐又低效。今天&#xff0c;我就向大家推荐一款效果非…

如何使用Alist:多网盘管理神器!一站式挂载、集成管理,支持WebDav

在日常生活中&#xff0c;我们或多或少会使用不同的网盘存储和处理各类文件&#xff0c;这往往导致我们的文件管理繁琐且效率低下。 Alist支持将多种不同的网盘服务集成到一个统一的界面中&#xff0c;让你能够轻松地挂载和管理所有文件。 通过Alist&#xff0c;你可以在一个界…

阿里发布“神笔马良版Sora”:寥寥数笔,动画自成

AI视频生成赛道风起云涌&#xff0c;国内外新颖的文生、图生视频产品层出不穷。在各大厂商的“内卷”之下&#xff0c;当下的视频生成模型各方面已经接近“以假乱真”的效果。例如&#xff0c;OpenAI 的 Sora 和国内的 Vidu、可灵等模型&#xff0c;通过利用 Diffusion Transfo…

structuredClone():JavaScript中深拷贝对象的最简单方法

前端岗位内推来了 深拷贝是传递或存储数据时的一项常规编程任务。 浅拷贝&#xff1a;只复制对象的第一层深拷贝&#xff1a;复制对象的所有层级 const obj { name: Tari, friends: [{ name: Messi }] };const shallowCopy { ...obj };const deepCopy dCopy(obj);console.lo…

C++——多态经典案例(二)制作饮品

案例&#xff1a;制作饮品的步骤是差不多一样的&#xff0c;假设都有四步&#xff0c;打开包装Open、煮水Boil、放杯子里面PutInCup、放佐料PutSomething、喝Drink 利用多态&#xff0c;制作茶和咖啡等饮品 分析&#xff1a;定义一个抽象类&#xff0c;纯虚函数包括Open、Boil…