美文网首页
【Spring源码配置文件解析】1.Environment系统配

【Spring源码配置文件解析】1.Environment系统配

作者: 天还下着毛毛雨 | 来源:发表于2020-12-29 15:19 被阅读0次

1. 配置信息的加载

Enviroment对象:负责加载系统的配置信息

image
image
image
image
image

new StandardEnvironment()会调到父类的构造方法中

image

父类的构造方法会调到自己实现的customizePropertySources()


image image
image

至此enviroment已经把系统的配置信息读到了内部的PropertySource中

本地配置信息加载

需要在application.xml中配置这样的自定义标签,来指定要加载的配置文件

image

那么,在spring容器解析xml文件的时候,就会解析到这个标签

image

解析context:property-placeholder标签

先根据标签头获取到一个链接


image

再根据链接从spring.handlers文件找到对应的处理器

image

找的时候会先调用Handler的init方法初始化内部的解析器,每种冒号后面的属性都会对应一个解析器,比如componetScan,property-placeholder

image

最终都放在内部从父类NamespaceHandlerSupport继承而来的parses容器中,是个key-value的map


image image

找到了这个类ContextNamespaceHandler


image

接下来调用这个类的parse方法,这里会先从内部的解析器容器中找到合适的解析器

image

这里获取到的是PropertyPlaceholderBeanDefinitionParser这个类


image
调用 PropertyPlaceholderBeanDefinitionParser 的parse方法

这部分的代码稍微有点绕,要么调父类的方法,父类的方法中又回调子类的重写的方法

先看继承图

image

首先调用父类AbstractBeanDefinitionParser的parse

image

方法体中有调用了下面一级父类的parseInternal方法,这个方法其实就是构建了一个BeanDefinition对象

image

其中需要注意的点就是这个BD对象的beanClass由子类解析器返回

image

可以看到,返回了一个PropertySourcesPlaceholderConfigurer类型,这个类型的bean后面再讲是干嘛的

构建BD对象的过程中又调用到了子类解析器的parseInternal的doParse方法,其实就是对BD对象的一些属性进行填充,这里最重要的标签中的location属性,表明要解析那个配置文件

image

parseInternal方法最终得到一个完成的Bd,parse方法在后面对这个类型为PropertySourcesPlaceholderConfigurer的BD注册到容器中,这就说明后续这个类型的bean会被实例化。

image

PropertySourcesPlaceholderConfigurer类

从类图中看看这个bean和普通的bean是否一样

image

可以看到这个类实现了一个很重要的接口BeanFactoryPostProcessor,那么他会比在普通的bean解析成BD之后,实例化之前进行实例化,并被容器调用到他的postProcessBeanFactory方法

image
  1. 将enviorment对象放到propertySources中
  2. 解析本地配置文件,放到propertySources中
image

该方法后面还会调用processProperties方法,将创建的StringValueResolver匿名对象,。该对象实现resolveStringValue方法,将调用propertyResolver(持有enviroment / 本地配置信息 的propertySource)来处理

image image image

相关文章

网友评论

      本文标题:【Spring源码配置文件解析】1.Environment系统配

      本文链接:https://www.haomeiwen.com/subject/ktofoktx.html