先说作用:
@EnableConfigurationProperties注解的作用是:使使用 @ConfigurationProperties 注解的类生效。
/**
* 要使用构造函数绑定,必须使用@EnableConfigurationProperties或配置属性扫描启用类。
* 不能对由常规 Spring 机制创建的 Bean 使用构造函数绑定(例如@Component Bean、通过
* @Bean 方法创建的 Bean 或使用@Import 加载的 Bean
*/
说明:
用springboot开发的过程中,我们会用到@ConfigurationProperties注解,主要是用来把properties或者yml配置文件转化为bean来使用的,而@EnableConfigurationProperties注解的作用是@ConfigurationProperties注解生效。
如果只配置@ConfigurationProperties注解,在IOC容器中是获取不到properties配置文件转化的bean的,当然在@ConfigurationProperties加入注解的类上加@Component也可以使交于springboot管理。
说白了 @EnableConfigurationProperties 相当于把使用 @ConfigurationProperties 的类进行了一次注入。
测试:@ConfigurationProperties
与 @EnableConfigurationProperties
的关系。
@EnableConfigurationProperties
文档中解释:
当@EnableConfigurationProperties
注解应用到你的@Configuration
时, 任何被@ConfigurationProperties
注解的beans将自动被Environment属性配置。 这种风格的配置特别适合与SpringApplication的外部YAML配置进行配合使用。
测试发现:
1.使用 @EnableConfigurationProperties Controller类
@RestController
@EnableConfigurationProperties(AcmeProperties.class)
public class YamlController {
@Autowired
private AcmeProperties acmeProperties;
@GetMapping("test")
public AcmeProperties acme(){
System.out.println(acmeProperties);
return acmeProperties;
}
}
2.@ConfigurationProperties
@Data
@ConfigurationProperties("acme")
@ConstructorBinding
public class AcmeProperties {
private boolean enabled;
private InetAddress remoteAddress;
private Security security ;
public AcmeProperties(boolean enabled, InetAddress remoteAddress ,Security security) {
this.enabled = enabled;
this.remoteAddress = remoteAddress;
this.security = security;
}
@Data
public static class Security{
private String username;
private String password;
private List<String> roles = new ArrayList<>();
public Security(String username, String password, List<String> roles) {
this.username = username;
this.password = password;
this.roles = roles;
}
}
}