1.声明
当前内容主要用于复习当前的SpringBoot的注解内容,用于明白@EnableConfigurationProperties和@ConfigurationProperties注解注解的作用
例如:之前我们获取db.properties文件中的value是使用${}
方式和Environment方式来实现的
问题:由于显示的获取,耦合度比较大,如果将这个配置放入当前的类中可能比较好
2.更换后的实现
DataSourceConfig.java中的内容
@Configuration
@ConditionalOnMissingBean(value = DataSource.class) // 这里表示如果缺少一个类型DataSource.class的实例的时候,会启动当前配置类
@PropertySource(value = {
"classpath:db.properties" }) // 必须在@EnableConfigurationProperties之前使用
@EnableConfigurationProperties({
DataSourceProperites.class }) // 这里表示卡其配置,并为DataSourceProperties创建实例
// 所有这个开启配置属性必须在加载配置文件之后执行
public class DataSourceConfig {
// 最后自动注入进来
@Autowired
DataSourceProperites dataSourceProperites;
public DataSourceConfig() {
// TODO Auto-generated constructor stub
System.out.println("DataSourceConfig.... 创建实例成功");
}
@Bean(name = "dataSource")
public DataSource dataSource() {
System.out.println("开始创建DataSourceConfig中的DataSource实例......");
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(dataSourceProperites.getDriverClassName());
dataSource.setUrl(dataSourceProperites.getUrl());
dataSource.setUsername(dataSourceProperites.getUsername());
dataSource.setPassword(dataSourceProperites.getPassword());
return dataSource;
}
}
DataSourceProperites.java中的内容
@ConfigurationProperties(prefix = "jdbc", ignoreUnknownFields = false)
public class DataSourceProperites {
public DataSourceProperites() {
// TODO Auto-generated constructor stub
System.out.println("DataSourceProperites 实例化成功............");
}
private String username;
private String password;
private String url;
private String driverClassName;
// 省略get、set、等方法
}
注意:这个加载和解析顺序不能弄错
- 必须先导入配置文件@PropertySource
- 再使用EnableConfigurationProperties:这个导入配置属性类,就是解析后直接创建该类型的实例bean
- 并且在配置属性类中使用:@ConfigurationProperties来按照前缀方式解析
如果顺序搞错,那么就会出现注入null的,导致DataSource连接失败
3.执行结果:
这是一个使用数据源DataSource访问数据库操作的结果,很明显成功!
4.开启数据校验
由于外界配置文件方式加载的数据,所以有的时候需要校验后才可以创建该bean
- 在该类上添加@Validated注解,表示该类的bean需要校验(通过debug发现该实例注入为一个CGLIB代理对象)
- 在需要的属性上面添加各种jsr302注解即可:@NotNull、@NotEmpty等
@ConfigurationProperties(prefix = "jdbc", ignoreUnknownFields = false)
// 开启配置属性校验,使用jsr302进行校验
@Validated // 通过debug发现返回一个cglib的代理对象
public class DataSourceProperites {
public DataSourceProperites() {
// TODO Auto-generated constructor stub
System.out.println("DataSourceProperites 实例化成功............");
}
@NotBlank
private String username;
@NotBlank
private String password;
@NotBlank
private String url;
//@NotNull // 表示不是null
@NotBlank // 表示字符串不能为null或者空字符串
private String driverClassName;
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 getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
}
这样使用@Autowired的时候就会进行属性校验了,可以防止注入失败的情况
5.总结
1.@EnableConfigurationProperties表示开启配置属性类自动实例化
,需要指定特定的配置属性类
2.@ConfigurationProperties表示解析配置文件的规则
3.当前操作的前提,属性必须在Env中或者已经导入了配置文件@PropertySource
4.小心当前的顺序问题