博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring静态配置加载原理剖析
阅读量:4094 次
发布时间:2019-05-25

本文共 1333 字,大约阅读时间需要 4 分钟。

一、何为静态配置

应用配置大致可以分为两类:动态配置和静态配置。

动态配置:常用zookeeper存储,未预定义在应用中,具体值在运动时动态获取。

静态配置:预定义于应用中的*.properties文件,在Spring容器启动时解析k-v对,并注入到相应的${...}占位符中。

二、核心类模型

三、主要流程解析

PlaceholderConfigurerSupport的实现类:PropertyPlaceholderConfigurer和PropertySourcesPlaceholderConfigurer。

以PropertyPlaceholderConfigurer为例,具体解析流程如下:

  • PropertiesLoaderSupport.mergeProperties():根据localOverride决定同名配置的覆写策略,合并xml文件中使用<prop>及<locations>标签定义的配置对,返回Properties对象。
  • PropertyResourceConfigurer.convertProperties():Spring提供的一个扩展点,可对上一步得到的Properties对象的k-v对进行自定义转换,默认不做转换直接返回原始Properties对象。借助此扩展点可以实现配置加解密,如将敏感配置定义为encrypted_key=value(value为加密的敏感信息),当扫描到propertyName有"encrypted_"前缀时,对value进行解密。
  • PropertyPlaceholderConfigurer.processProperties():

a.创建PlaceholderResolvingStringValueResolver实例,用于bean占位符解析;

b.调用PlaceholderConfigurerSupport.doProcessProperties()方法,传入a步骤得到的解析器:

借助解析器,在BeanDefinitionVisitor.visitBeanDefinition()尝试访问bean的详细信息。这里我们只关注bean的property替换,直接找到BeanDefinitionVisitor.visitPropertyValues()方法。继续追到BeanDefinitionVisitor.resolveStringValue()方法,终于调到了我们的解析器PlaceholderResolvingStringValueResolver.resolveStringValue()。具体的解析工作交由PropertyPlaceholderHelper.replacePlaceholders(),有兴趣可以研究一下这段代码,Spring对于bean配置值的嵌套占位符支持也是在这里体现的(如:${...${...}})。

总之,这一步做的就是访问当前BeanFactory实例中的所有bean定义信息,若有使用占位符(如:key=${...}),则尝试在前面得到的Properties对象中查找相应的k-v对做替换(如:key=value),用value完善bean定义信息。

你可能感兴趣的文章
自学编程的八大误区!克服它!
查看>>
GitHub 上的一个开源项目,可快速生成一款属于自己的手写字体!
查看>>
早知道这些免费 API,我就可以不用到处爬数据了!
查看>>
Java各种集合类的合并(数组、List、Set、Map)
查看>>
JS中各种数组遍历方式的性能对比
查看>>
Mysql复制表以及复制数据库
查看>>
进程管理(一)
查看>>
linux 内核—进程的地址空间(1)
查看>>
存储器管理(二)
查看>>
开局一张图,学一学项目管理神器Maven!
查看>>
Android中的Binder(二)
查看>>
Framework之View的工作原理(一)
查看>>
Web应用架构
查看>>
设计模式之策略模式
查看>>
深究Java中的RMI底层原理
查看>>
用idea创建一个maven web项目
查看>>
Kafka
查看>>
9.1 为我们的角色划分权限
查看>>
维吉尼亚之加解密及破解
查看>>
DES加解密
查看>>