全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-18 6 分钟 ✍️ juanwangdev

Spring Boot 配置属性绑定

Spring Boot提供多种方式将配置文件属性绑定到Java对象。

@ConfigurationProperties

基本用法

Java
@ConfigurationProperties(prefix = "app.datasource")
public class DataSourceProperties {

    private String url;
    private String username;
    private String password;
    private int maxPoolSize = 10;

    // getters and setters
}
YAML
app:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: secret
    max-pool-size: 20

启用方式

Java
// 方式一:@EnableConfigurationProperties
@Configuration
@EnableConfigurationProperties(DataSourceProperties.class)
public class MyConfiguration { }

// 方式二:@ConfigurationPropertiesScan(Spring Boot 2.2+)
@ConfigurationPropertiesScan
@SpringBootApplication
public class Application { }

// 方式三:@Component + @ConfigurationProperties
@Component
@ConfigurationProperties(prefix = "app.datasource")
public class DataSourceProperties { }

构造器绑定

Java
@ConfigurationProperties(prefix = "app.datasource")
public class DataSourceProperties {

    private final String url;
    private final String username;
    private final int maxPoolSize;

    // Spring Boot 2.2+ 支持构造器绑定
    public DataSourceProperties(String url, String username, int maxPoolSize) {
        this.url = url;
        this.username = username;
        this.maxPoolSize = maxPoolSize;
    }

    // 只有getter,无setter,属性不可变
}

构造器绑定的类需要在配置类中使用@EnableConfigurationProperties@ConfigurationPropertiesScan启用。

@Value注解

Java
@Component
public class MyService {

    @Value("${app.name}")
    private String appName;

    @Value("${app.timeout:3000}")  // 默认值
    private int timeout;

    @Value("${app.features:feature1,feature2}")
    private List<String> features;
}

对比

特性@ConfigurationProperties@Value
松散绑定支持不支持
SpEL不支持支持
类型转换自动需指定
集合绑定简洁复杂
验证支持JSR-303不支持

松散绑定

Java
@ConfigurationProperties(prefix = "my-service")
public class MyProperties {
    private String hostName;  // 可匹配多种写法
}
YAML
# 以下写法都能匹配hostName属性
my-service:
  host-name: localhost      # 推荐(标准)
  hostname: localhost       # 小写
  host_name: localhost      # 下划线
  HOST_NAME: localhost      # 大写(环境变量)

类型转换

Java
@ConfigurationProperties(prefix = "app")
public class AppProperties {

    private Duration timeout;         // 10s, 5m, 2h
    private DataSize maxSize;         // 10MB, 5GB
    private LocalDate startDate;      // 2024-01-01
    private List<String> names;       // ["a", "b", "c"]
}
YAML
app:
  timeout: 30s
  max-size: 100MB
  start-date: 2024-06-01
  names: [a, b, c]

属性验证

Java
@ConfigurationProperties(prefix = "app")
@Validated
public class AppProperties {

    @NotBlank
    private String name;

    @Min(1)
    @Max(100)
    private int poolSize;

    @Pattern(regexp = "^[a-z]+$")
    private String mode;
}

默认值处理

Java
@ConfigurationProperties(prefix = "app")
public class AppProperties {

    private boolean enabled = true;       // 字段默认值
    private String name;                  // null默认值
    private int timeout = 5000;           // 数值默认值
}

第三方配置绑定

Java
@ConfigurationProperties(prefix = "third-party.db")
@Bean
public DataSource dataSource() {
    // 将配置绑定到返回的Bean
}

要点总结

  • @ConfigurationProperties批量绑定配置到对象
  • 构造器绑定实现不可变配置对象
  • 松散绑定支持多种命名风格
  • 自动类型转换支持Duration、DataSize等
  • JSR-303注解验证配置有效性
  • @Value适合简单配置获取,支持SpEL

📝 发现内容有误?点击此处直接编辑

← 上一篇 Spring Boot 自定义Starter测试
下一篇 → Spring Boot @Enable注解与@Import原理
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库