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 {};
}