SpringBoot读取配置文件@Value || @ConfigurationProperties
@Value 注解
优点:
- 简单易用:
@Value
注解非常简单,适用于读取单个属性或简单的配置。 - 灵活性:可以在任何 Spring 管理的 bean 中使用
@Value
注解,包括普通的 bean、控制器、服务等。
缺点:
- 缺乏类型安全性:
@Value
注解不提供类型安全性检查,如果配置值的类型不匹配,只有在运行时才能发现。 - 不适用于大量配置:当需要读取大量配置时,使用
@Value
注解需要编写大量的注解,不够便于管理。 - 不能使用松散绑定:无法使用松散绑定,属性名必须与配置文件中的键完全匹配。
@ConfigurationProperties 注解
优点:
- 类型安全:
@ConfigurationProperties
提供类型安全的配置绑定,Spring Boot 可以在启动时对配置属性的类型进行验证,减少了在运行时出现配置错误的可能性。 - 支持松散绑定:可以通过
@ConfigurationProperties
支持松散绑定,属性名不需要严格匹配,减少了配置错误的可能性。 - 适用于大量配置:
@ConfigurationProperties
更适合于读取大量配置,可以使用前缀来对配置进行分组,使配置更易于管理。 - 支持嵌套属性:
@ConfigurationProperties
支持嵌套属性的绑定,可以将配置信息组织为多层次的结构。
缺点:
- 需要额外的类:使用
@ConfigurationProperties
需要额外编写一个 Java 类来映射配置属性,可能增加了代码量。 - 相对复杂:相对于
@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());
}
}