ConfigurationProperties注解

@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,如果使用了注解,那么就把从配置文件中解析出来的数据,使用反射技术注入进去。