@ConfigurationProperties绑定配置文件参数

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

@ConfigurationProperties绑定配置⽂件参数
Spring配置⽅式
第⼀阶段:xml配置
在spring 1.x时代,使⽤spring开发满眼都是xml配置的bean,随着项⽬的扩⼤,
我们需要把xml配置⽂件分放到不同的配置⽂件中,那时候需要频繁地在开发的类和配置⽂件间切换。

第⼆阶段:注解配置
在spring 2.x时代,随着JDK1.5带来的注解⽀持,spring提供了声明bean的注解,
⼤⼤减少了配置量。

这时spring圈⼦存在⼀种争论:注解配置和xml配置究竟哪个更好?我们最终的选择是应⽤
的基本配置⽤xml,业务配置⽤户注解。

第三阶段:Java配置(java config)
从spring 3.x到现在,spring提供了Java配置的能⼒,使⽤Java配置更好的理解
配置的bean。

spring 4.x和spring boot都推荐使⽤Java配置。

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相⽐,因类注释是在⼀个类源代码中,可以获得类型安全检查的好处。

可以良好的⽀持重构。

JavaConfig就是使⽤注释来描述Bean配置的组件。

JavaConfig 是Spring的⼀个⼦项⽬, ⽐起Spring,它还是⼀个⾮常年青的项⽬。

⽬前的版本是1.0 M2。

使⽤XML来配置Bean所能实现的功能,通过JavaConfig同样可以很好的实现。

下⾯具体讲⼀讲@ConfigurationProperties使⽤⽅法
@ConfigurationProperties
Spring源码中⼤量使⽤了ConfigurationProperties注解,⽐如server.port就是由该注解获取到的,通过与其他注解配合使⽤,能够实现Bean的按需配置。

该注解有⼀个prefix属性,通过指定的前缀,绑定配置⽂件中的配置,该注解可以放在类上,也可以放在⽅法上
可以从注解说明中看到,当将该注解作⽤于⽅法上时,如果想要有效的绑定配置,那么该⽅法需要有@Bean注解且所属Class需要有
@Configuration注解。

简单⼀句话概括就是:Sring的有效运⾏是通过上下⽂(Bean容器)中Bean的配合完成的,Bean可以简单理解成对象,有些对象需要指定字段内容,那么这些内容我们可以通过配置⽂件进⾏绑定,然后将此Bean归还给容器
作⽤于⽅法
⽐较常见的就是配置读写分离的场景。

配置⽂件内容
Copy
#数据源
spring.datasource.druid.write.url=jdbc:mysql://localhost:3306/jpa
ername=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
ername=root
spring.datasource.druid.read.password=1
spring.datasource.druid.read.driver-class-name=com.mysql.jdbc.Driver
java代码
Copy
@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=,此时你只需要在注解中加上以下参数即可
以上就完成了多个数据源的配置,为读写分离做了铺垫
作⽤于Class类及其⽤法
配置⽂件内容
Copy
spring.datasource.url=jdbc:mysql://127.0.0.1:8888/test?useUnicode=false&autoReconnect=true&characterEncoding=utf-8
ername=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
java代码
Copy
@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) {
ername = 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;
}
}
⽤法
Copy
@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;
}
}
总结
1. @ConfigurationProperties 和 @value 有着相同的功能,但是 @ConfigurationProperties的写法更为⽅便
2. @ConfigurationProperties 的 POJO类的命名⽐较严格,因为它必须和prefix的后缀名要⼀致, 不然值会绑定不上, 特殊的后缀名是“driver-
class-name”这种带横杠的情况,在POJO⾥⾯的命名规则是下划线转驼峰就可以绑定成功,所以就是 “driverClassName”。

相关文档
最新文档