作用: 通过与其他注解配合使用,能够实现Bean的按需配置
可以放哪里: 类上,方法上
作用于方法
使用条件: 当将@ConfigurationProperties
作用于方法上时,该方法需要有@Bean
且所属类需要有@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 {
@Bean(name = "readDruidDataSource")
@ConfigurationProperties(prefix = "spring.datasource.druid.read")
public DataSource readDruidDataSource() {
return new DruidDataSource();
}
@Primary
@Bean(name = "writeDruidDataSource")
@ConfigurationProperties(prefix = "spring.datasource.druid.write")
public DataSource writeDruidDataSource() {
return new DruidDataSource();
}
}
作用于类
使用场景: 配置数据库
# 配置文件内容
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
public class DatasourcePro {
private String url;
private String username;
private String password;
private String driverClassName; // 配置文件中是driver-class-name, 转驼峰命名便可以绑定成
private String type;
// standard getters and setters
}
@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、该注解有一个 prefix
属性,根据指定的前缀来绑定配置文件中的配置
2、@ConfigurationProperties
和 @value
有着相同的功能,@ConfigurationProperties
其实就类似于使用多个 @Value
同时绑定,绑定的是对象
;
3、 @ConfigurationProperties
修饰的POJO类的命名比较严格,必须和 prefix
的后缀名一致, 不然值会绑定不上。但是配置文件里蛇形命名
变量 “driver-class-name”
和 POJO里面转驼峰
命名属性 “driverClassName”
可以绑定成功。