为什么不推荐在Spring Boot中使用@Value加载配置

spring,boot,value · 浏览次数 : 0

小编点评

**不推荐使用`@Value`注解** `@Value`注解的主要问题是,当我们使用它直接提取配置信息时,会产生配置信息加载的碎片化问题。碎片化的配置信息会导致一些问题,例如: * 当我们要修改配置相关逻辑时,需要遍历整个配置加载过程,才能找到需要修改的配置信息。 * 无法方便地维护多个服务或控制器使用相同的配置。 * 无法进行配置校验,导致配置错误的出现。 **推荐使用`@ConfigurationProperties`来替代`@Value`** `@ConfigurationProperties`是一种更灵活的配置加载方式,可以帮助我们解决碎片化的问题。`@ConfigurationProperties`允许我们通过配置类中的属性来动态加载配置信息。另外,它还支持配置校验,可以帮助我们发现配置错误。 **使用`@ConfigurationProperties`的实现方法:** ```java @ConfigurationProperties(prefix = "com.didispace") public class DidispaceProperties { private String title; } ``` **使用`@ConfigurationProperties`的优点:** * 避免碎片化配置信息。 * 支持配置校验。 * 允许我们通过属性配置配置。 **其他建议:** * 在使用`@ConfigurationProperties`之前,请确保我们的配置类是可配置的。 * 可以使用 `@Validated` 注解进行配置校验。

正文

@Value注解相信很多Spring Boot的开发者都已经有接触了,通过使用该注解,我们可以快速的把配置信息加载到Spring的Bean中。

比如下面这样,就可以轻松的把配置文件中key为com.didispace.title配置信息加载到TestService中来使用

@Service
public class TestService {

    
    @Value("${com.didispace.title}")
    private String title;

}

这个注解可以说非常的好用!但是为什么不推荐大家使用它呢?核心原因是:当我们使用@Value来直接提取配置信息使用的时候,会产生配置信息加载的碎片化。比如,同一个配置,可能背多个Service或者Controller使用,当我们再要修改它的时候,就会存在一个遗漏的风险。我们无法方便的维护这些配置加载而导致一些问题。

那么,如果不使用@Value,我们应该用什么来替代呢?

我比较推荐的就是使用@ConfigurationProperties来分类和加载各种配置信息,比如,我要加载关于com.didispace的相关配置时候,就写一个这样的实现:

@Configuration
@ConfigurationProperties(prefix = "com.didispace")
public class DidispaceProperties {

    private String title;

}

这个DidispaceProperties就会加载com.didispace开头的配置。其他Service或者Controller要使用这些配置的时候,就通过注入DidispaceProperties就也可以了。如果要修改配置相关的逻辑,也只需要修改DidispaceProperties中的内容即可,而不是到处找@Value的配置。

另外,在这里,其实还可以增加对配置的校验,主要在pom.xml中引入spring-boot-starter-validation模块。然后修改配置类,增加@Validated注解和具体校验注解,比如:

@Validated
@Configuration
@ConfigurationProperties(prefix = "com.didispace")
public class DidispaceProperties {

  @NotNull
  private String title;

}

这就轻松实现配置的校验了,是不是很方便呢?

今天的分享就到这里。如果您学习过程中如遇困难?可以加入我们超高质量的Spring技术交流群,参与交流与讨论,更好的学习与进步!更多Spring Boot教程可以点击直达!,欢迎收藏与转发支持!

欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源

与为什么不推荐在Spring Boot中使用@Value加载配置相似的内容:

为什么不推荐在Spring Boot中使用@Value加载配置

@Value注解相信很多Spring Boot的开发者都已经有接触了,通过使用该注解,我们可以快速的把配置信息加载到Spring的Bean中。 比如下面这样,就可以轻松的把配置文件中key为com.didispace.title配置信息加载到TestService中来使用 @Service publ

不只有 Spring,这四款 Java 基础开发框架同样值得关注! 审核中

Java 开发不只有 Spring ,今天给大家推荐几个同样优秀的 Java 基础开发框架,为日常项目开发提供更多的选择。答应我,请不要再叫我 Spring 小子了,​好吗? 项目概览: Guice:轻量级依赖注入框架 Javalin:轻量级 Java 和 Kotlin Web 框架 Quarkus

为什么不推荐使用Linq?

相信很多.NETer看了标题,都会忍不住好奇,点进来看看,并且顺便准备要喷作者! 这里,首先要申明一下,作者本人也非常喜欢Linq,也在各个项目中常用Linq。 我爱Linq,Linq优雅万岁!!!(PS:顺便吐槽一下,隔壁Java从8.0版本推出的Streams API,抄了个四不像,一点都不优雅

[转帖]为什么不推荐使用/etc/fstab

https://www.jianshu.com/p/af49a5d0553f 对于工作中使用服务器的公司来讲,每到节假日来临时,总免不了对服务器进行下电。而收假回来的早上,则会有一个早上的时间会花费在服务区的开机和修复工作上。是的,修复无法开启或开机失败的服务器。 几乎每次节假日售价回来,恢复服务器

如何创建一个线程池,为什么不推荐使用Executors去创建呢?

我们在学线程的时候了解了几种创建线程的方式,比如继承Thread类,实现Runnable接口、Callable接口等,那对于线程池的使用,也需要去创建它,在这里我们提供2种构造线程池的方法: 方法一: 通过ThreadPoolExecutor构造函数来创建(首选) 这是JDK中最核心的线程池工具类,

android中Room数据库的基本使用

简介: 还在使用原生的sqllite?有这么清爽且稳如狗的room为啥不用呢? Room是Google官方推荐使用的数据库,相比较某些优秀数据库框架来说,不用过于担心某天库会停止维护,且访问数据库非常流畅,并且提供了与常规的ORM框架一样,通过添加编译期注解来进行表和字段的配置,譬如@Databas

关于.Net 6.0 在Linux ,Docker容器中,不安装任何依赖就生成图形验证码!!!!!!!!!!!

在.Net Framework时代,我们生成验证码大多都是用System.Drawing。 在.Net 6中使用也是没有问题的。 但是,System.Drawing却依赖于Windows GDI+。 为了实现跨平台,我陷入了沉思!! 微软推荐使用SkiaSharp 进行替代,所以就开始了,踩坑之旅

[转帖]Linux性能测试之unixbench

https://www.modb.pro/db/487945 大家好,昨天为大家带来了一篇关于在Linux下性能测试的文章《性能测试之LTP》,今天继续为大家推荐系列工具之unixbench,本工具用于Linux中cpu系统的测试,详情请查看百度,这里不多赘述,本文主要用于演示如何使用此工具。本文使

[转帖]Linux性能测试之unixbench

https://www.modb.pro/db/487945 大家好,昨天为大家带来了一篇关于在Linux下性能测试的文章《性能测试之LTP》,今天继续为大家推荐系列工具之unixbench,本工具用于Linux中cpu系统的测试,详情请查看百度,这里不多赘述,本文主要用于演示如何使用此工具。本文使

《最新出炉》系列初窥篇-Python+Playwright自动化测试-6-元素定位大法-下篇

1.简介 上一篇主要是讲解我们日常工作中在使用Playwright进行元素定位的一些比较常用的定位方法的理论基础知识以及在什么情况下推荐使用。今天这一篇讲解和分享一下,在日常中很少用到或者很少见的定位,但是遇到了我们也要会,俗话说:手里有粮心里不慌。 2.阴影定位-Shadow DOM 在做web自