一、简单的源码分析
Spring源码中大量使用了ConfigurationProperties注解,比如server.port
就是由该注解获取到的,通过与其他注解配合使用,能够实现Bean的按需配置。
该注解有一个prefix属性,通过指定的前缀,绑定配置文件中的配置,通过如下源码可以看出,该注解可以放在类上,也可以放在方法上。
二、@ConfigurationProperties时使用的注意事项
1. 前缀定义了哪些外部属性将绑定到类的字段上;
2. 根据 Spring Boot 宽松的绑定规则,类的属性名称必须与外部属性的名称匹配;
Spring 宽松绑定规则 (relaxed binding,Spring使用一些宽松的绑定属性规则。因此,以下变体都将绑定到 hostName 属性上:
hostName、hostname、host-name、host_name、HOST_NAME等。
3. 我们可以简单地用一个值初始化一个字段来定义一个默认值;
4. 类本身可以是包私有的;
5. 类的字段必须有公共 setter 方法;
三、实例应用
@ConfigurationProperties的使用有两种方式。
配置文件内容,这里用的是*.poperties做的案例,实际使用中组好使用*.yml文件。
spring.datasource.url=jdbc:mysql://127.0.0.1:8888/test?useUnicode=false&autoReconnect=true&characterEncoding=utf-8 spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
第一种是作用类上:如下
java代码:
@ConfigurationProperties(prefix = "spring.datasource") @Component public class DatasourcePro { private String url; private String username; private String password; // 配置文件中是driver-class-name, 转驼峰命名便可以绑定成 private String driverClassName; private String type; public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getDriverClassName() { return driverClassName; } public void setDriverClassName(String driverClassName) { this.driverClassName = driverClassName; } public String getType() { return type; } public void setType(String type) { this.type = type; } }
controller中的使用:
@Controller @RequestMapping(value = "/config") public class ConfigurationPropertiesController { @Autowired private DatasourcePro datasourcePro; @RequestMapping("/test") @ResponseBody public Map<String, Object> test(){ Map<String, Object> map = new HashMap<>(); map.put("url", datasourcePro.getUrl()); map.put("userName", datasourcePro.getUsername()); map.put("password", datasourcePro.getPassword()); map.put("className", datasourcePro.getDriverClassName()); map.put("type", datasourcePro.getType()); return map; } }
第二种作用与方法上:
java POJO:
public class Datasource { private String url; private String username; private String password; // 配置文件中是driver-class-name, 转驼峰命名便可以绑定成 private String driverClassName; private String type; public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getDriverClassName() { return driverClassName; } public void setDriverClassName(String driverClassName) { this.driverClassName = driverClassName; } public String getType() { return type; } public void setType(String type) { this.type = type; } }
配置类上:
@Configuration public class DruidDataSourceConfig { /** * DataSource 配置 * @return */ @ConfigurationProperties(prefix = "spring.datasource.druid.read") @Bean(name = "readDruidDataSource") public DataSource readDruidDataSource() { return new DruidDataSource(); } }
四、拓展
1. 通过源码可以看大有 ignoreInvalidFields和ignoreUnknownFields两个属性。其中
ignoreInvalidFields:表示是文件*.yml提供了DataSource类无法转换的属性,默认情况下,Spring Boot 将会启动失败,并抛出异常:
ignoreUnknownFields:表示文件*.yml提供了DataSource类无法识别的属性;
2. 启动时校验 @ConfigurationProperties、Duration、DataSize、Deprecated(@DeprecatedConfigurationProperty)。
详情可参考https://blog.csdn.net/yusimiao/article/details/97622666博客
总结:
1. @ConfigurationProperties 和 @value 有着相同的功能,但是 @ConfigurationProperties的写法更为方便
2. Spring Boot 的 @ConfigurationProperties
注解在绑定类型安全的 Java Bean 时是非常强大的,我们可以配合其注解属性和
@DeprecatedConfigurationProperty
注解获取到更友好的编程方式,同时这样让我们的配置更加模块化。