【从零开始学Spring Boot】-2.Spring Boot ConfigurationProperties 配置


1.简介

1.1 概述

Annotation for externalized configuration. Add this to a class definition or a @Bean method in a @Configuration class if you want to bind and validate some external Properties (e.g. from a .properties file).

Binding is either performed by calling setters on the annotated class or, if @ConstructorBinding is in use, by binding to the constructor parameters.

Note that contrary to @Value, SpEL expressions are not evaluated since property values are externalized.

一个外部化配置的注解。如果您要绑定和验证某些外部属性(例如,来自.properties文件),则将其添加到类定义或 @Configuration 类中的 @Bean 方法中。

绑定可以通过在带注释的类上调用setter来执行,或者,如果正在使用 @ConstructorBinding,则可以通过绑定到构造函数参数来执行。

请注意,与@Value相反,由于属性值是外部化的,因此不评估SpEL表达式。

1.2 特点

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ConfigurationProperties {

    String value() default "";

    String prefix() default "";

    boolean ignoreInvalidFields() default false;

    boolean ignoreUnknownFields() default true;
}

1.3 对比 @Value

@Configuration @Value
功能 批量注入配置文件中的属性 一个个指定
松散绑定(松散语法) 支持 不支持
SPEL语法 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持

2.环境

  1. JDK 1.8.0_201
  2. Spring Boot 2.2.0.RELEASE
  3. 构建工具(apache maven 3.6.3)
  4. 开发工具(IntelliJ IDEA )

3.代码

3.1 代码结构

3.2 maven 依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

3.3 配置文件

application.properties

user.prop.name=zhangsan
user.prop.age=20

3.4 java代码

UserProperties.java

@Component
@Validated // JSR303数据校验
@ConfigurationProperties(prefix = "user.prop")
public class UserProperties {

    @NotBlank
    private String name;

    @Range(min = 1, max = 200)
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

UserProps.java

@Component
public class UserProps {
    @Value("${user.prop.name}")
    private String name;

    // SPEL 表达式
    @Value("#{10 * 2}")
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

UserController.java

@RestController
public class UserController {

    @Autowired
    private UserProperties userProperties;

    @Autowired
    private UserProps userProps;

    @GetMapping("/user/get/1")
    public String getUser1() {
        return userProperties.getName() + "'s age is " + userProperties.getAge();
    }

    @GetMapping("/user/get/2")
    public String getUser2() {
        return userProps.getName() + "'s age is " + userProps.getAge();
    }
}

3.5 git 地址

spring-boot/spring-boot-02-config

4.效果展示

启动 SpringBoot02ConfigApplication.main 方法,在 spring-boot-02-config.http 访问如下两个地址,输出 “zhangsan’s age is 20” 表示请求成功

5.参考

  1. @ConfigurationProperties与@Value的区别
  2. springboot中@Value的工作原理

文章作者: Soulballad
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Soulballad !
评论
 上一篇
【源码分析-Spring Boot】-2.Spring Boot 是如何解析配置注解的 【源码分析-Spring Boot】-2.Spring Boot 是如何解析配置注解的
Spring Boot 的配置解析: 【从零开始学Spring Boot】-2.Spring Boot ConfigurationProperties 配置 1.@ConfigurationProperties 是如何生效的? @Spr
2020-07-11
下一篇 
【源码分析-Spring Boot】-1.Spring Boot 的启动流程和加载原理 【源码分析-Spring Boot】-1.Spring Boot 的启动流程和加载原理
Spring Boot 的初步使用: 【从零开始学Spring Boot】-1.第一个Spring Boot应用 1.Spring Boot 启动流程是怎样的? 从 main 方法开始 @SpringBootApplication pu
2020-07-09
  目录