SpringBoot读取配置文件@Value || @ConfigurationProperties

@Value 注解

优点

  1. 简单易用@Value 注解非常简单,适用于读取单个属性或简单的配置。
  2. 灵活性:可以在任何 Spring 管理的 bean 中使用 @Value 注解,包括普通的 bean、控制器、服务等。

缺点

  1. 缺乏类型安全性@Value 注解不提供类型安全性检查,如果配置值的类型不匹配,只有在运行时才能发现。
  2. 不适用于大量配置:当需要读取大量配置时,使用 @Value 注解需要编写大量的注解,不够便于管理。
  3. 不能使用松散绑定:无法使用松散绑定,属性名必须与配置文件中的键完全匹配。

@ConfigurationProperties 注解

优点

  1. 类型安全@ConfigurationProperties 提供类型安全的配置绑定,Spring Boot 可以在启动时对配置属性的类型进行验证,减少了在运行时出现配置错误的可能性。
  2. 支持松散绑定:可以通过 @ConfigurationProperties 支持松散绑定,属性名不需要严格匹配,减少了配置错误的可能性。
  3. 适用于大量配置@ConfigurationProperties 更适合于读取大量配置,可以使用前缀来对配置进行分组,使配置更易于管理。
  4. 支持嵌套属性@ConfigurationProperties 支持嵌套属性的绑定,可以将配置信息组织为多层次的结构。

缺点

  1. 需要额外的类:使用 @ConfigurationProperties 需要额外编写一个 Java 类来映射配置属性,可能增加了代码量。
  2. 相对复杂:相对于 @Value 注解,@ConfigurationProperties 略微复杂一些,需要一定的配置和理解。

选择建议

  • 如果您的配置比较简单,只需要读取少量的配置项,并且对类型安全性要求不是很高,那么可以使用 @Value 注解。
  • 如果您的配置比较复杂,有大量的配置项,并且对类型安全性要求较高,建议使用 @ConfigurationProperties 注解。它更适合于组织和管理大量的配置信息,同时提供了类型安全的配置绑定功能。

 

@ConfigurationProperties使用演示:

比如我想在mvc请求中添加拦截器,拦截指定路径的path做相应处理,这个path就可以在配置文件application.properties中读取,避免硬编码问题
rate.limit.path=/test/**

@ConfigurationProperties(prefix = "rate.limit")
@Component
public class RateLimitConfig {

    private String path;

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

}


@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    private final RateLimitConfig rateLimitConfig;

    public WebMvcConfig(RateLimitConfig rateLimitConfig) {
        this.rateLimitConfig = rateLimitConfig;
    }
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new RateLimitInterceptor()).addPathPatterns(rateLimitConfig.getPath());
    }
}

 

posted @ 2024-03-23 12:03  Ashe|||^_^  阅读(50)  评论(0编辑  收藏  举报