@ConfigurationProperties是springboot提供读取配置文件的一个注解。其对应的bean的后置处理器为
ConfigurationPropertiesBindingPostProcessor类,它是实现了BeanPostProcessor接口,在bean被实例化后,会调用后置处理,递归的查找属性,通过反射注入值,对大多数属性而言强制需提供其setter和getter方法。
@ConfigurationProperties注解加载配置文件三种常见的用法,如下:
这里需要注意的是,@ConfigurationProperties注解不仅可以配合@Component注解使用,同时还可以配合继承了@Component注解的其他注解,比如@Controller、@Service、@Repository等,当然这些个注解都有固定的使用常见,所以很少配合@ConfigurationProperties使用,但是配合@Configuration注解使用的情况还是比较常见的,而@Configuration注解也继承了@Component注解。
具体使用方法如下,这里对应的属性值可以是简单字符串,Map对象、List对象等:
@Slf4j
@Getter
@Setter
@ConfigurationProperties(prefix = MultiDataSourceProperties.PREFIX)
@Configuration
public class MultiDataSourceProperties {public static final String PREFIX = "spring.datasource.multi";/*** 必须设置默认的库,默认master*/private String primary = "master";private Map datasource = new LinkedHashMap<>();}
@Configuration注解的配置类中通过@Bean注解在某个方法上将方法返回的对象定义为一个Bean,并使用配置文件中相应的属性初始化该Bean的属性。
@Configuration
public class DataSourceConfig {@Primary@Bean(name = "primaryDataSource")@ConfigurationProperties(prefix="spring.datasource.primary")public DataSource primaryDataSource() {return DataSourceBuilder.create().build();}
}
使用@ConfigurationProperties注解到普通类,然后再通过@EnableConfigurationProperties定义为Bean。
下面示例和前面的代码类似,但是这里没有使用@Configuration注解,而是在MultiDataSourceAutoConfiguration配置类中使用@EnableConfigurationProperties注解进行配置。
@Slf4j
@Getter
@Setter
@ConfigurationProperties(prefix = MultiDataSourceProperties.PREFIX)
public class MultiDataSourceProperties {public static final String PREFIX = "spring.datasource.multi";/*** 必须设置默认的库,默认master*/private String primary = "master";private Map datasource = new LinkedHashMap<>();
}@Configuration
@EnableConfigurationProperties(MultiDataSourceProperties.class)
public class MultiDataSourceAutoConfiguration {private final MultiDataSourceProperties properties;public MultiDataSourceAutoConfiguration(MultiDataSourceProperties properties) {this.properties = properties;}}
@ConfigurationProperties注解 和 @Value注解 都可以实现读取配置文件值注入到JavaBean,但是在用法上有一些区别:
关于@ConfigurationProperties 注解 与 @Value注解更详细的对比可以参考《注解@ConfigurationProperties 和 @Value 对比》。
在使用@ConfigurationProperties 注解时,出现“Not registered via @EnableConfigurationProperties or marked as Spring component”报错信息时,说明没有正确使用该注解,主要是没有在使用@ConfigurationProperties 注解的类上配合使用@Component注解使用或者没有配合@EnableConfigurationProperties这个注解进行注册为属性配置的类。