1. 配置信息的加载
Enviroment对象:负责加载系统的配置信息
imageimage
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属性,表明要解析那个配置文件
imageparseInternal方法最终得到一个完成的Bd,parse方法在后面对这个类型为PropertySourcesPlaceholderConfigurer的BD注册到容器中,这就说明后续这个类型的bean会被实例化。
imagePropertySourcesPlaceholderConfigurer类
从类图中看看这个bean和普通的bean是否一样
image可以看到这个类实现了一个很重要的接口BeanFactoryPostProcessor,那么他会比在普通的bean解析成BD之后,实例化之前进行实例化,并被容器调用到他的postProcessBeanFactory方法
image- 将enviorment对象放到propertySources中
- 解析本地配置文件,放到propertySources中
该方法后面还会调用processProperties方法,将创建的StringValueResolver匿名对象,。该对象实现resolveStringValue方法,将调用propertyResolver(持有enviroment / 本地配置信息 的propertySource)来处理
image image image
网友评论