背景
在SpringBoot环境中,我们有“使用不完的”注解。这也是SpringBoot替代了传统的Spring项目中的xml配置的原因。在使用这些annotation的时候,我们一定要了解这些注解背后的原理以及约定。
1 | package org.springframework.boot.context.properties; |
支持的类型
List
1 | /root = |
对应的Java实现
1 | "custom.config.config1") (prefix = |
Map
1 | value1 = |
对应的Java实现
1 | "custom.config.config1") (prefix = |
Object
1 | host1 = |
对应的Java实现
1 | "custom.config.config1") (prefix = |
Object List
1 | host1 = |
对应的Java实现
1 | "custom.config.config1") (prefix = |
Map的使用案例
比如,我们同时需要连接多个OSS(阿里对象存储),那我们就可以利用ConfigurationProperties的方式来配置多个。而且可以通过Spring的加载动态的注入到容器中去。
配置中心的配置:
1 | # OSS1配置 |
对应的Java实现
1 |
|
动态的定义我们需要的BeanDefinition。
1 | public class MultiOssScannerConfigurer implements BeanDefinitionRegistryPostProcessor, InitializingBean, ApplicationContextAware, BeanNameAware { |
通过binder来让配置与对应的Java代码产生关系:
1 |
|
如何使用?
1 |
|
Binder是如何映射的?
通过上面的代码binder.bind(OssConstants.MULTI_CONFIG_PREFIX, MultiOssProperties.class).get();
来进行bind。
1 | protected final <T> T bind(ConfigurationPropertyName name, Bindable<T> target, BindHandler handler, Context context, boolean allowRecursiveBinding) { |
如果我们的key是:oss.multi.clients.accout.xxx
实际上对应的是Map,那么它的引用名字就是clients。具体的key就是accout,那么对应的value就是OssProperties。
1 | private Object bindBean(ConfigurationPropertyName name, Bindable<?> target, |
具体的一个bind情况。
1 | private static final List<BeanBinder> BEAN_BINDERS; |
参考地址
如果大家喜欢我的文章,可以关注个人订阅号。欢迎随时留言、交流。如果想加入微信群的话一起讨论的话,请加管理员简栈文化-小助手(lastpass4u),他会拉你们进群。