简介
说明
对于application.yml里边的配置,我们可以通过@Value来获得,比如:@Value(“${user.name}”)。但是,如果属性很多,写很多个@Value就会很繁琐。
解决方案就是:使用@ConfigurationProperties,将一组属性通过一个类来接收。
注意
- 保存属性的类必须加getter和setter。
- prefix不能有这些:大写字母、某些特殊字符(比如:_、~、!、@、#、$、*、+、:等)
- 可以包含的字符有:-
 
@ConfigurationProperties与@Value的区别
| 项 | @ConfigurationProperties | @Value | 
| 类型 | Map、内部类、对象等。 | 不支持内部类、对象。 | 
| spEl表达式 | 不支持 | 支持 | 
| JSR303数据校验 | 支持 | 不支持 | 
| 功能 | 一个列属性批量注入 | 单属性注入 | 
使用方法
法1:@ConfigurationProperties+@Component
@Component
@ConfigurationProperties(prefix = "hello")
@Data
public class HelloProperties {
    private String name;
    private List<String> emails;
    private Map<String, Integer> price;
}
法2:@ConfigurationProperties+@Bean
此时HelloProperties不需要加任何注解。
配置类
@Configuration
public class Config {
    @Bean
    @ConfigurationProperties(prefix = "hello")
    public HelloProperties helloProperties(){
        return new HelloProperties();
    }
}
实体类
@Data
public class HelloProperties {
    private String name;
    private List<String> emails;
    private Map<String, Integer> price;
}
法3:@EnableConfigurationProperties+@ConfigurationProperties
在有@Configuration注解的类上加@EnableConfigurationProperties来声明。
配置类
@Configuration
@EnableConfigurationProperties(HelloProperties.class)
public class HelloConfiguration {
}
实体类
@ConfigurationProperties(prefix = "hello")
@Data
public class HelloProperties {
    private String name;
    private List<String> emails;
    private Map<String, Integer> price;
}
嵌套实体类
如果存在嵌套实体类,要写为静态内部类。只有静态内部类在yml配置时才会有自动补全提示!
比如:
package com.example.config;
import lombok.Data;
@Component
@ConfigurationProperties(prefix = "hello")
@Data
public class HelloProperties {
    private Boolean enabled;
    private String helloName1;
    private ChildProperties child;
    @Data
    public static class ChildProperties {
        private String childName;
        private Long id;
    }
}
这样在输入hello.child时,会自动提示出child-name和id。
如果不写为静态内部类,就只能提示到hello.child这一层,没有child-name和id这种内部字段的提示!
备注
以上代码提示是starter使用如下依赖时的功能:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <scope>provided</scope>
</dependency>
实例
application.yml
hello:
  relaxed:
    enabled: true
    helloname1: helloname1
    helloName2: helloName2
    HELLONAME3: HELLONAME3
    hello-name4: hello-name4
    hello_name5: hello_name5
    HELLO-NAME6: HELLO-NAME6
    hiname1: hiname1
    hiName2: hiName2
    HINAME3: HINAME3
    hi-name4: hi-name4
    hi_name5: hi_name5
    HI-NAME6: HI-NAME6
    child:
      childName1: childName
      id: 1000
配置类及属性类
配置类
package com.example.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ConfigPropConf {
    @Bean
    @ConfigurationProperties(prefix = "hello.relaxed")
    public HelloProperties httpsProperties() {
        return new HelloProperties();
    }
}
顶层属性类
package com.example.config;
import lombok.Data;
@Data
public class HelloProperties {
    private Boolean enabled;
    private String helloName1;
    private String helloName2;
    private String helloName3;
    private String helloName4;
    private String helloName5;
    private String helloName6;
    private String hiname1;
    private String hiname2;
    private String hiname3;
    private String hiname4;
    private String hiname5;
    private String hiname6;
    private ChildProperties child;
    @Data
    public static class ChildProperties {
        private String child_Name1;
        private Long id;
    }
}
Controller
package com.example.controller;
import com.example.config.HelloProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
@RestController
@RequestMapping("/hello")
public class HelloController {
    @Autowired
    private HelloProperties helloProperties;
    @GetMapping("/prop")
    public HelloProperties prop() {
        return helloProperties;
    }
}
测试
访问:http://localhost:8080/hello/prop


请先 !