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的时候就会进行属性校验了,可以防止注入失败的情况

扫描二维码关注公众号,回复: 12724402 查看本文章

5.总结

1.@EnableConfigurationProperties表示开启配置属性类自动实例化,需要指定特定的配置属性类

2.@ConfigurationProperties表示解析配置文件的规则

3.当前操作的前提,属性必须在Env中或者已经导入了配置文件@PropertySource

4.小心当前的顺序问题

猜你喜欢

转载自blog.csdn.net/weixin_45492007/article/details/114088201
今日推荐