从配置文件中根据前缀批量注入属性之@ConfigurationProperties

1、@ConfigurationProperties

在我们平时做项目时,肯定遇到过需要从yml或者properties配置文件中获取属性值得情况,一般我们都会用@Value("$(xxx.xxx)")注解来完成,当注入的属性个数不多时,使用@Value注解确实是一个不错的办法,但当注入的属性超过5个时,继续使用@Value就会使类显得臃肿,想象一下,当你看到十几个@Value注入时,是不是觉得不太美观,像改造一下呢?那有什么办法可以解决这一问题呢?答案是:@ConfigurationProperties 注解。那么这个注解该怎么使用呢?以及使用过程需要注意哪些问题呢?

2、具体使用

首先我们要先建一个属性类,类似vo类,该类中拥有我们想要注入属性的字段,然后我们在该类上标注@ConfigurationProperties注解并将要注入属性的前缀路径作为参数填入,参考如下:

@Data    // 可以使用@Data 或者生成Getter和Setter方法,不论怎样必须要有Setter方法
@ConfigurationProperties("spring.datasource")    // 此处必须填属性前缀
public class DataSourceProperties {

	/**
	 * 用户名
	 */
	private String username;

	/**
	 * 密码
	 */
	private String password;

	/**
	 * jdbcurl
	 */
	private String url;

	/**
	 * 驱动类型
	 */
	private String driverClassName;

	/**
	 * 查询数据源的SQL
	 */
	private String queryDsSql = "select * from gen_datasource_conf where del_flag = 0";

}

3、注意事项

仅仅完成上面的内容还不行,我们都知道,在spring项目中实体类和VO类是不会注册成Bean的,只有被标注的一些特殊注解(@Component、@Controller、@Service等等)的类才会注册成Bean,所以,上面新建的DataSourceProperties类并不会生效,还会报错,因为他根本就没有注册成Bean并纳入IOC容器,所以属性注入过程没办法完成。解决办法有两个:一是添加一个@Component注解,二是使用@EnableConfigurationProperties(DataSourceProperties.class)注解将DataSourceProperties类注册成Bean,在Bean初始化的过程中就会通过Setter方法根据路径前缀给对应的属性赋值,也就是完成了属性注入。所以DataSourceProperties类中必须要Setter方法,不然Bean初始化的赋值过程就完成不了,自然属性注入也就必定失败。

4、@EnableConfigurationProperties

主要作用是将参数类注册成Bean,通过观察该注源码发现该过程使用@Import注解完成Bean注册,还不知道@Import注解的小伙伴可以参考我的这篇博客springboot项目如何将项目外部配置类纳入spring ioc容器

// @EnableConfigurationProperties的使用参考
@Configuration(proxyBeanMethods = false)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DynamicDataSourceAutoConfiguration {

	@Bean
	public DynamicDataSourceProvider dynamicDataSourceProvider(StringEncryptor stringEncryptor,
			DataSourceProperties properties) {
		return new JdbcDynamicDataSourceProvider(stringEncryptor, properties);
	}

	@Bean
	public DsProcessor dsProcessor() {
		return new LastParamDsProcessor();
	}

}



// @EnableConfigurationProperties注解内容,可以看到主要是使用了@Import注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({EnableConfigurationPropertiesRegistrar.class})
public @interface EnableConfigurationProperties {
    String VALIDATOR_BEAN_NAME = "configurationPropertiesValidator";

    Class<?>[] value() default {};
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值