Spring源码中大量使用了ConfigurationProperties
注解,比如server.port
就是由该注解获取到的,通过与其他注解配合使用,能够实现Bean的按需配置。
该注解有一个prefix
属性,通过指定的前缀,绑定配置文件中的配置,该注解可以放在类上,也可以放在方法上
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ConfigurationProperties {}
可以从注解说明中看到,当将该注解作用于方法上时,如果想要有效的绑定配置,那么该方法需要有@Bean
注解且所属Class需要有@Configuration
注解。
#数据源
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
@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();
}
}
相信大家肯定了解@Value
注解,它可以通过全限定名进行配置的绑定,这里的ConfigurationProperties
其实就类似于使用多个@Value
同时绑定,绑定的对象就是DataSource类型的对象,而且是隐式绑定的,意味着在配置文件编写的时候需要与对应类的字段名称相同,比如上述spring.datasource.druid.write.url=jdbc:mysql://localhost:3306/jpa
,当然了,你也可以随便写个配置,比如spring.datasource.druid.write.uuu=www.baidu.com
,此时你只需要在注解中加上以下参数即可。
boolean ignoreInvalidFields() default false;
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
@ConfigurationProperties(prefix = "spring.datasource")
@Component
@Getter
@Setter
public class DatasourcePro {
private String url;
private String username;
private String password;
// 配置文件中是driver-class-name, 转驼峰命名便可以绑定成
private String driverClassName;
private String 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”
。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。