Spring静态配置加载原理剖析

本文介绍Spring框架中静态配置的应用及解析流程,重点讲解了PropertyPlaceholderConfigurer如何处理*.properties文件中的配置项,包括合并策略、自定义转换及占位符解析等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、何为静态配置

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

动态配置:常用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定义信息。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值