@ConfigurationProperties注解在SpringBoot中的使用。在配置多数据源时用到了这个注释,详细了解一下。
基本使用方式
获取配置文件的数据时,我们通常使用自带的@Value注解,在使用的类中声明一个final类型的常量,就可以随意是使用了。除了这一个还有一个注解,就是@ConfigurationProperties。不过这个注解是加在Bean上使用,指定配置数据的前缀,对应的配置数据就会自动加载到Bean中。
与@Value的区别
示例:多数据源的数据库配置
1 2 3 4 5 6 7 8 9 10
| primary.spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver primary.spring.datasource.jdbc-url=jdbc:mysql://localhost:3306/vueblog?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true primary.spring.datasource.username=root primary.spring.datasource.password=root
secondary.spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver secondary.spring.datasource.jdbc-url=jdbc:mysql://localhost:3306/vueuser?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true secondary.spring.datasource.username=root secondary.spring.datasource.password=root
|
使用方式:在Bean方法上加上注解,在使用时,配置数据就会自动注入。
1 2 3 4 5 6 7
| @Primary @Bean("primary") @ConfigurationProperties(prefix = "primary.spring.datasource") public DataSource primaryDataSourceProperties() { return DataSourceBuilder.create().build(); }
|
源码分析
在源码中,SpringBoot主要帮助我们做了两件事情:
- 获取到使用@ConfigurationProperties的类。
- 解析配置文件,并把对应的值设置到我们的Bean中。
BeanPostProcessor在Spring的Bean初始化之前与之后执行。
1 2 3 4 5 6 7 8
| public interface BeanPostProcessor { Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException; Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException; }
|
上面这两个方法实现BeanPostProcessor接口之后,检查每一个初始化成功的Bean,如果使用了注解,那么就把从配置文件中解析出来的数据,使用反射技术注入进去。