SpringBoot复习:@EnableConfigurationProperties和@ConfigurationProperties注解的作用

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、等方法
}

注意:这个加载和解析顺序不能弄错

  1. 必须先导入配置文件@PropertySource
  2. 再使用EnableConfigurationProperties:这个导入配置属性类,就是解析后直接创建该类型的实例bean
  3. 并且在配置属性类中使用:@ConfigurationProperties来按照前缀方式解析

如果顺序搞错,那么就会出现注入null的,导致DataSource连接失败

3.执行结果:

在这里插入图片描述

这是一个使用数据源DataSource访问数据库操作的结果,很明显成功!

4.开启数据校验

由于外界配置文件方式加载的数据,所以有的时候需要校验后才可以创建该bean

  1. 在该类上添加@Validated注解,表示该类的bean需要校验(通过debug发现该实例注入为一个CGLIB代理对象)
  2. 在需要的属性上面添加各种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.小心当前的顺序问题

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值