注解@ConfigurationProperties使用方法
前言
最近在思考使用java config的方式进行配置,java config是指基于java配置的spring。传统的Spring通常都是基本xml配置的,后来spring3.0新增了许多java config的注解,特别是spring boot,基本都是清一色的java config。java
Spring配置方式
第一阶段:xml配置 在spring 1.x时代,使用spring开发满眼都是xml配置的bean,随着项目的扩大, 咱们须要把xml配置文件分放到不一样的配置文件中,那时候须要频繁地在开发的类和配置文件间切换。mysql
第二阶段:注解配置
在spring 2.x时代,随着JDK1.5带来的注解支持,spring提供了声明bean的注解, 大大减小了配置量。这时spring圈子存在一种争论:注解配置和xml配置究竟哪一个更好?咱们最终的选择是应用 的基本配置用xml,业务配置用户注解。spring
第三阶段:Java配置(java config)
从spring 3.x到如今,spring提供了Java配置的能力,使用Java配置更好的理解 配置的bean。spring 4.x和spring boot都推荐使用Java配置。sql
Spring IOC有一个很是核心的概念——Bean。由Spring容器来负责对Bean的实例化,装配和管理。XML是用来描述Bean最为流行的配置方式。但随着Spring的日益发展,愈来愈多的人对Spring提出了批评。“Spring项目大量的烂用XML”就是最为严励的一个批评。因为Spring会把几乎全部的业务类都以Bean的形式配置在XML文件中,形成了大量的XML文件。使用XML来配置Bean失去了编译时的类型安全检查。大量的XML配置使得整个项目变得更加复杂。安全
随着JAVA EE 5.0的发布,其中引入了一个很是重要的特性——Annotations(注释)。注释是源代码的标签,这些标签能够在源代码层进行处理或经过编译器把它熔入到class文件中。在JAVA EE5之后的版本中,注释成为了一个主要的配置选项。Spring使用注释来描述Bean的配置与采用XML相比,因类注释是在一个类源代码中,能够得到类型安全检查的好处。能够良好的支持重构。app
JavaConfig就是使用注释来描述Bean配置的组件。JavaConfig 是Spring的一个子项目, 比起Spring,它仍是一个很是年青的项目。目前的版本是1.0 M2。使用XML来配置Bean所能实现的功能,经过JavaConfig一样能够很好的实现。ui
下面具体讲一讲@ConfigurationProperties使用方法this
@ConfigurationProperties
Spring源码中大量使用了ConfigurationProperties注解,好比server.port
就是由该注解获取到的,经过与其余注解配合使用,可以实现Bean的按需配置。url
该注解有一个prefix属性,经过指定的前缀,绑定配置文件中的配置,该注解能够放在类上,也能够放在方法上spa
能够从注解说明中看到,当将该注解做用于方法上时,若是想要有效的绑定配置,那么该方法须要有@Bean注解且所属Class须要有@Configuration注解。
简单一句话归纳就是:Sring的有效运行是经过上下文(Bean容器)中Bean的配合完成的,Bean能够简单理解成对象,有些对象须要指定字段内容,那么这些内容咱们能够经过配置文件进行绑定,而后将此Bean归还给容器
做用于方法
比较常见的就是配置读写分离的场景。
配置文件内容
#数据源 spring.datasource.druid.write.url=jdbc:mysql://localhost:3306/jpa spring.datasource.druid.write.username=root spring.datasource.druid.write.password=1 spring.datasource.druid.write.driver-class-name=com.mysql.jdbc.Driver spring.datasource.druid.read.url=jdbc:mysql://localhost:3306/jpa spring.datasource.druid.read.username=root spring.datasource.druid.read.password=1 spring.datasource.druid.read.driver-class-name=com.mysql.jdbc.Driver
java代码
@Configuration public class DruidDataSourceConfig { /** * DataSource 配置 * @return */ @ConfigurationProperties(prefix = "spring.datasource.druid.read") @Bean(name = "readDruidDataSource") public DataSource readDruidDataSource() { return new DruidDataSource(); } /** * DataSource 配置 * @return */ @ConfigurationProperties(prefix = "spring.datasource.druid.write") @Bean(name = "writeDruidDataSource") @Primary public DataSource writeDruidDataSource() { return new DruidDataSource(); } }
也许有的人看到这里会比较疑惑,prefix并无指定配置的全限定名,那它是怎么进行配置绑定的呢?
相信你们确定了解@Value注解,它能够经过全限定名进行配置的绑定,这里的ConfigurationProperties其实就相似于使用多个@Value同时绑定,绑定的对象就是DataSource类型的对象,并且是 隐式绑定 的,意味着在配置文件编写的时候须要与对应类的字段名称 相同,好比上述spring.datasource.druid.write.url=jdbc:mysql://localhost:3306/jpa
,固然了,你也能够随便写个配置,好比 spring.datasource.druid.write.uuu=www.baidu.com
,此时你只须要在注解中加上如下参数便可
以上就完成了多个数据源的配置,为读写分离作了铺垫
做用于Class类及其用法
配置文件内容
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 @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; } }
总结
- @ConfigurationProperties 和 @value 有着相同的功能,可是 @ConfigurationProperties的写法更为方便
- @ConfigurationProperties 的 POJO类的命名比较严格,由于它必须和prefix的后缀名要一致, 否则值会绑定不上, 特殊的后缀名是“driver-class-name”这种带横杠的状况,在POJO里面的命名规则是 下划线转驼峰 就能够绑定成功,因此就是 “driverClassName”