欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

spring是如何解析xml配置文件中的占位符

程序员文章站 2022-03-18 16:41:08
前言我们在配置spring xml配置文件的时候,可以在文件路径字符串中加入 ${} 占位符,spring会自动帮我们解析占位符,这么神奇的操作spring是怎么帮我们完成的呢?这篇文章我们就来一步步...

前言

我们在配置spring xml配置文件的时候,可以在文件路径字符串中加入 ${} 占位符,spring会自动帮我们解析占位符,这么神奇的操作spring是怎么帮我们完成的呢?这篇文章我们就来一步步揭秘。

1.示例

这段代码在我工程里是会报错的,如下:

可以看到报错里面的文件路径变成了1.8.0_144.xml,也就是说spring帮我们把${java.version}解析成了实际值。

2.原理

abstractrefreshableconfigapplicationcontext
我们在之前的文章里提到过这个类的resolve方法,我们再来瞧一眼:

获取当前环境,这个环境在示例代码中就是 standardenvironment ,并且根据当前环境去解析占位符,这个占位符解析不到还会报错。

resolverequiredplaceholders由standardenvironment的父类abstractenvironment实现。

abstractenvironment

这里的propertysources很重要了,从命名也可以看出我们解析占位符的来源就是从这个集合中来的。这个集合是在我们standardenvironment实例化的时候去自定义的。

standardenvironment

最重要的肯定是我们的 propertyresolver.resolverequiredplaceholders 方法了,propertyresolver.resolverequiredplaceholders其实是propertysourcespropertyresolver的父类abstractpropertyresolver来实现。

abstractpropertyresolver

这里的 this::getpropertyasrawstring 很重要,利用了java8的函数式接口来实现。它的定义在abstractpropertyresolver里

但是我们在doresolveplaceholders里指向的this,所以还得看propertysourcespropertyresolver类。

propertysourcespropertyresolver

看到没有,我们是遍历this.propertysources集合,然后根据key调用它的getproperty方法获取value。我们从上面的standardenvrionment中看到我们定义的是 mappropertysource 和 systemenvironmentpropertysource .

mappropertysource

这里的source就是getsystemproperties(),也就是 abstractenvironment中的方法:

我们还忘了很重要的一步,就是propertyplaceholderhelper的replaceplaceholders方法。

propertyplaceholderhelper

到这里我们就可以看到spring在处理一个小小的占位符就做了这么多设计。可见这个架构是如此严谨。下篇文章我们就来探讨下spring是如何加载这个xml文件的。

以上就是spring是如何解析xml配置文件中的占位符的详细内容,更多关于spring解析xml 占位符的资料请关注其它相关文章!