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.环境
- JDK 1.8.0_201
- Spring Boot 2.2.0.RELEASE
- 构建工具(apache maven 3.6.3)
- 开发工具(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” 表示请求成功