【@ConfigurationProperties注解的用处】

介绍

@ConfigurationProperties 是 Spring 框架中的一个注解,用于将配置文件中的属性映射到 Java 对象的字段上。它的主要用途是简化配置文件与 Java 对象之间的映射过程,使得配置更加方便、可读,并提供类型安全的属性访问。

用途和特性

  • 属性映射: 将配置文件中的属性映射到 Java 对象的字段上。这样,可以通过在 Java 类中定义字段来组织和访问应用程序的配置。

  • 类型安全: 通过在 Java 类型上使用注解,可以实现类型安全的属性访问。如果配置文件中的属性与 Java 类型不匹配,Spring 在启动时会报错,提前发现配置错误。

  • 嵌套属性: 支持将配置文件中的属性嵌套到 Java 对象的嵌套字段中,使得可以更结构化地组织配置信息。

  • 多环境支持: 可以通过在注解中指定 prefix 属性,将不同环境下的配置信息分组,从而实现多环境配置。

  • 默认值: 可以为字段设置默认值,如果配置文件中没有相应的属性,将使用默认值。

  • 动态刷新: 在 Spring Boot 中,@ConfigurationProperties 还支持动态刷新,当配置发生变化时,可以通过 @RefreshScope 注解实现动态刷新,而不需要重启应用程序。

  • 属性验证: 可以使用 @Validated 注解结合 JSR 303 标准的验证注解,对配置属性进行验证。

示例如下:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "myapp")
public class MyAppProperties {

    private String appName;
    private int maxConnections;
    // other properties...

    // getters and setters...
}

在上面的例子中,@ConfigurationProperties 注解指定了 prefix 属性为 “myapp”,表示配置文件中的属性应该以 “myapp” 为前缀。例如,配置文件中的属性可以是 myapp.appName 和 myapp.maxConnections。这些属性将被映射到 MyAppProperties 类的相应字段上。

与@Value的区别

@ConfigurationProperties 和 @Value 是 Spring 中用于获取配置信息的两种不同方式

  1. 类型安全:

@ConfigurationProperties 提供了类型安全的配置绑定。你可以创建一个 Java 类,将配置属性映射到该类的字段上,Spring 会自动将配置文件中的值绑定到相应的字段,而且会进行类型转换。如果类型不匹配,Spring 会在启动时报错。
@Value 是基于 SpEL(Spring Expression Language)的,它是一个字符串表达式,不提供类型安全性。你需要手动进行类型转换,并且如果类型不匹配,可能会导致运行时错误。

  1. 多属性绑定:

@ConfigurationProperties 支持将多个属性绑定到一个类中,使得配置更加结构化,适用于组织复杂的配置信息。
@Value 一般用于单一属性的注入,较难组织复杂的配置信息。

  1. 适用场景:

@ConfigurationProperties 适用于大量配置属性、多个相关配置属性的情况,尤其是复杂的配置信息。
@Value 适用于简单的属性注入,对于少量的配置项。

最大的区别在于第一点类型安全上
使用 @ConfigurationProperties 时,可以将配置文件中的属性直接映射到一个 Java 类的字段上。Spring 在启动时会尝试将配置文件中的值转换为字段声明的类型。如果类型不匹配,Spring 会在启动时检测到并报告错误。这种类型检查是在应用程序启动时进行的,有助于提前发现配置错误,而不是在运行时发生意外行为。

其次就是可以通过java类管理配置属性,对于配置属性较多情况下可以使其更加统一

@value的优点体现在对于两个关系不大的配置上,比如有myapp.aaa.ccc.bbb=1myapp.qqq=2这样的两个配置
如果使用@ConfigurationProperties注解,需要嵌套方式去获取内容,如下:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "myapp")
public class MyAppProperties {
    private final AAA aaa = new AAA();
    private int qqq;

    public static class AAA {
        private final CCC ccc = new CCC();

        public static class CCC {
            private int bbb;

            public int getBbb() {
                return bbb;
            }

            public void setBbb(int bbb) {
                this.bbb = bbb;
            }
        }

        public CCC getCcc() {
            return ccc;
        }
    }

    public AAA getAaa() {
        return aaa;
    }

    public int getQqq() {
        return qqq;
    }

    public void setQqq(int qqq) {
        this.qqq = qqq;
    }
}

结论

结合@ConfigurationProperties的优点,我们在约定配置文件时,相同的业务配置尽量有统一的前缀和减少嵌套(通过下划线或者横杠映射类的驼峰命名),不同的业务配置有不同的prefix。这样便于使用一个配置类管理。示例如下:
在这里插入图片描述

补充

补充一些其他类似的spring注解

  • @ConditionalOnproperity
    @ConditionalOnProperty 是 Spring Boot 中的一个条件注解,用于根据配置属性的值来决定是否要启用某个配置类、Bean 或组件。这个注解在以下场景中特别有用:

特定配置开关: 你可以使用 @ConditionalOnProperty 来根据配置文件中的某个属性值来决定是否启用某个配置。例如,只有在配置文件中设置了特定的属性时,某个Bean 或配置类才会生效。

@Configuration
@ConditionalOnProperty(name = "myapp.feature.enabled", havingValue = "true")
public class MyFeatureConfiguration {
    // 配置类的内容...
}

myapp.feature.enabled=true,这样配置类 MyFeatureConfiguration 就会在属性 myapp.feature.enabled 的值为 true 时生效。

  • @ConditionalOnMissingBean
    @ConditionalOnMissingBean 是 Spring Boot 中的一个条件注解,用于在特定的 Bean 还不存在时启用某个配置类、Bean 或组件。这个注解在以下场景中特别有用:

默认实现: 当你有一个接口或抽象类有多个实现时,可以使用 @ConditionalOnMissingBean 注解来提供一个默认的实现。如果容器中已经有了某个实现的 Bean,那么就不会再创建这个默认实现的 Bean。

@Service
public class DefaultMyService implements MyService {
    // 默认实现的内容...
}

@Service
@ConditionalOnMissingBean(MyService.class)
public class CustomMyService implements MyService {
    // 自定义实现的内容...
}

在这个例子中,如果容器中已经有了类型为 MyService 的 Bean(例如 DefaultMyService),那么 CustomMyService 就不会被创建。如果没有,就会创建 CustomMyService。

插件化扩展: 当你提供一种插件机制,允许开发者在应用程序中注册自定义实现时,可以使用 @ConditionalOnMissingBean。这样,如果用户自己定义了实现,就使用用户的实现;否则,使用默认实现。

@Configuration
public class MyConfig {

    @Bean
    @ConditionalOnMissingBean
    public MyPlugin myPlugin() {
        return new DefaultMyPlugin();
    }
}

在这个例子中,如果容器中已经有了 MyPlugin 类型的 Bean,那么 myPlugin 方法就不会创建新的 Bean;否则,它会创建一个默认的 DefaultMyPlugin Bean。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云计算与低代码:加速应用开发与创新的双核引擎

云计算与低代码是当前技术领域中备受关注的两大趋势。本文将探讨云计算与低代码的定义、应用领域以及它们如何协同作用,加速应用开发与创新的进程。 引言 随着科技的飞速发展,数字化转型已经成为了企业追求高效和创新的重要途径。在这个过程中&#xff0…

推荐一款优秀的json在线格式化校验工具

www.bjson.chat 这个工具是目前见过最好用的JSON工具, 页面简单,支持text,tree两种显示格式,关键词高亮显示支持亮白和暗黑两种风格最主要的是如果要格式化很长的json的话,这个工具还可以全屏显示,简直不…

【图论】重庆大学图论与应用课程期末复习资料2-各章考点(计算部分)(私人复习资料)

图论各章考点 二、树1、避圈法(克鲁斯克尔算法)2、破圈法3、Prim算法 四、路径算法1、Dijkstra算法2、Floyd算法 五、匹配1、匈牙利算法(最大权理想匹配(最小权权值取反)) 六、行遍性问题1、Fleury算法&…

Spring系列注解补充

JsonProperty JsonProperty 是jackson-databindjar包提供的注解,用于实体类的属性上,功能是把属性名称转换为另一个名称(即 两个名称都指向同一个变量值) 该注解主要用于实体类的属性上,作用可以简单的理解为在反序列…

前端依赖下载速度过慢解决方法,nrm 镜像管理工具

npm 默认镜像 :https://registry.npmjs.org/ 问题 使用 npm install 安装依赖的时候,受网络的限制,速度会很慢。 解决 使用国内镜像代理。 nrm nrm 是镜像源管理工具; 1. 安装 nrm npm install nrm --global# 查看镜像源列…

金蝶云星空对接泛微E9流程打通示例

泛微E9对接金蝶云星空,主要介绍由泛微OA发起审批后把审批结果和审批意见回传给到金蝶云星空财务进行做账处理。实现内部办公一体化(使用案例场景:报销申请,付款申请等)。 数据源系统:泛微OA-E9 泛微OA&…

搜维尔科技:AI时代,迈向2030元宇宙数字人戏曲教育数字化思维、战略与未来!

一场关于中国传统戏曲与数字媒体交汇的探讨之旅将于今日在清华大学开讲,本次活动旨在推动AI时代大背景下,利用元宇宙、数字人等创新技术焕发中国传统戏曲全新活力。 讲座以“AI时代,迈向2030元宇宙数字人戏曲教育数字化思维、战略与未来”为主…

「词令」2023年12月5日支付宝蚂蚁庄园今日问题答案是什么?12.5蚂蚁庄园今日问题正确答案

问题:我国哪个城市有“四面荷花三面柳,一城山色半城湖”的美誉? 选项:A、济南 B、泉州 答案:济南 解析:一城山色:千佛山在城南,为附近最高的山,全城人都能看到它苍翠的…

Docker镜像构建:技术深度解析与实践

目录 ​编辑 一、Docker镜像基础与优化 Docker镜像概念 Dockerfile详解 层级缓存机制 二、镜像构建的高级技术 多阶段构建 安全性考量 三、构建性能优化与调试 性能优化策略 构建过程调试 四、代码实战 实例:构建优化的Docker镜像 调试技巧 实例&…

敏捷开发迭代缺陷统计的重要性

在敏捷开发中,迭代缺陷统计具有重要性,对团队和项目具有多方面的影响: 早期发现和解决问题: 迭代缺陷统计允许团队及时识别和定位在迭代中出现的问题。这有助于早期解决问题,避免问题扩大化,并最大程度地减…

Java Websocket实现即时通讯功能入门教程

近年来,即时通讯(Instant Messaging)已经成为了人们日常生活中不可缺少的一部分。而Java Websocket技术则提供了一种简便高效的方式来实现即时通讯功能。本文将介绍如何使用Java Websocket来实现即时通讯,并提供具体的代码示例。 …

【C语言】分支语句详解

目录 一、C语言语句类型 1.语句是什么 2.C语言的五类语句 二、分支语句 1. if语句 a. if语句的基本语法结构 b.悬空else 2.switch语句 a.switch语句的语法形式 b.default语句 一、C语言语句类型 1.语句是什么 在C语言中,语句是以分号结尾的字符序列&#…

陀螺仪防抖术语

陀螺仪防抖术语 fov 视场角 drift 零偏   MotionFusion即运动传感器的融合补偿,对陀螺仪、加速度计等运动测量器件的数据 进行预处理,通过标定和补偿,为防抖提供校准后的陀螺仪数据 ratio 系数 gyro 陀螺仪 calibration 校准 标定 DIS&…

开发与AI的邂逅

目录 一、前言 二、百度文心一言 三、阿里通义灵码 3.1.工具介绍 3.2.产品功能 3.3.配置流程 3.4.适用范围 3.5.收费标准 3.6.注意事项 一、前言 前段时间,由OpenAI公司研发的一款聊天机器人程序ChatGPT(全名:Chat Generative …

CLIP在Github上的使用教程

CLIP的github链接:https://github.com/openai/CLIP CLIP Blog,Paper,Model Card,Colab CLIP(对比语言-图像预训练)是一个在各种(图像、文本)对上进行训练的神经网络。可以用自然语…

千方百计阻止内网崩溃:上海迅软DSE答疑深度解析攻击后果

如今企业数据安全已成为一大议题,内网安全作为企业数据安全的第一步,一旦遭到攻击有多严重? 1.数据泄露:非法攻击企业内网者可能获取到重要的公司数据,包括客户信息、财务数据、知识产权等,导致隐私泄露和经…

linux系统下农场种菜小游戏!

linux系统下农场种菜小游戏! 今天给大家分享一个linux系统下一个简单的小游戏 源码如下,在linux系统下创建一个.sh的脚本文件,复制粘贴进去即可! #!/bin/bash# 初始化变量 vegetables("生菜" "西兰花" &qu…

Netty03-核心组件NioEventLoopGroup解读

NioEventLoopGroup 可以看到NioEventLoopGroup继承了MultithreadEventExecutorGroup并且实现了EventLoopGroup接口,而这两个类被ExecutorService修饰,所以NioEventLoopGroup实际上是一个线程池,池中的对象其实就是单个的NioEventLoop。 源码…

Comprehension from Chaos: Towards Informed Consent for Private Computation

目录 笔记后续的研究方向摘要引言 Comprehension from Chaos: Towards Informed Consent for Private Computation CCS 2023 笔记 本文探讨了用户对私有计算的理解和期望,其中包括多方计算和私有查询执行等技术。该研究进行了 22 次半结构化访谈,以调查…

DataGrip连接虚拟机上Docker部署的Mysql出错解决

1.1 首先判断CentOS的防火墙,如果开启就关闭 //查看防火墙状态 systemctl status firewalld //关闭防火墙systemctl stop firewalld.service//关闭防火墙开机自启systemctl disable firewalld.service而后可以打开DataGrip连接了,如果连接不上执行如下…