【Java教程】为什么不推荐在Spring Boot中使用@Value加载配置

零 Java教程评论55字数 1231阅读4分6秒阅读模式

在Spring Boot中,不推荐使用@Value注解来加载配置的主要原因是它会导致配置信息的碎片化。例如,同一个配置项可能被多个Service或Controller使用,这在修改配置时可能会带来遗漏的风险。此外,这种方式也不便于维护配置信息,可能会导致问题。相比之下,建议使用@ConfigurationProperties注解来集中管理和加载配置信息,这样更加方便和安全。

@Value注解相信很多Spring Boot的开发者都已经有接触了,通过使用该注解,我们可以快速的把配置信息加载到Spring的Bean中。文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/15140.html

比如下面这样,就可以轻松的把配置文件中key为com.didispace.title配置信息加载到TestService中来使用文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/15140.html

java

复制代码
@Service
public class TestService {

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

}

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

那么,如果不使用@Value,我们应该用什么来替代呢?文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/15140.html

我比较推荐的就是使用@ConfigurationProperties来分类和加载各种配置信息,比如,我要加载关于com.didispace的相关配置时候,就写一个这样的实现:文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/15140.html

java

复制代码
@Configuration
@ConfigurationProperties(prefix = "com.didispace")
public class DidispaceProperties {

    private String title;

}

这个DidispaceProperties就会加载com.didispace开头的配置。其他Service或者Controller要使用这些配置的时候,就通过注入DidispaceProperties就也可以了。如果要修改配置相关的逻辑,也只需要修改DidispaceProperties中的内容即可,而不是到处找@Value的配置。文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/15140.html

另外,在这里,其实还可以增加对配置的校验,主要在pom.xml中引入spring-boot-starter-validation模块。然后修改配置类,增加@Validated注解和具体校验注解,比如:文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/15140.html

java

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

  @NotNull
  private String title;

}

这就轻松实现配置的校验了,是不是很方便呢?文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/15140.html

文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/15140.html文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/15140.html

零
  • 转载请务必保留本文链接:https://www.0s52.com/bcjc/javajc/15140.html
    本社区资源仅供用于学习和交流,请勿用于商业用途
    未经允许不得进行转载/复制/分享

发表评论