我们在基于spring开发应用的时候,一般都会将数据库的配置放置在properties文件中.
代码分析的时候,涉及的知识点概要:
1.NamespaceHandler 解析xml配置文件中的自定义命名空间
2.ContextNamespaceHandler 上下文相关的解析器,这边定义了具体如何解析property-placeholder的解析器
3.BeanDefinitionParser 解析bean definition的接口
4.BeanFactoryPostProcessor 加载好bean definition后可以对其进行修改
5.PropertySourcesPlaceholderConfigurer 处理bean definition 中的占位符
我们先来看看具体的使用吧
property的使用
在xml文件中配置properties文件
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://parator.sort(priorityOrderedPostProcessors); invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);我们再来看看PropertySourcesPlaceholderConfigurer的继承体系把
1.BeanFactoryPostProcessor
定义一个用于修改容器中bean definition的属性的接口.其实现类在一般类使用前先实例化,并对其他类的属性进行修改.
这跟BeanPostProcessor有明显的区别,BeanPostProcessor是修改bean实例的.
2.PropertiesLoaderSupport
加载properties文件的抽象类.
这边具体的加载逻辑是委托PropertiesLoaderUtils#fillProperties实现
3.PropertyResourceConfigurer
bean definition中占位符的替换就是这个抽象类实现的.
实现BeanFactoryPostProcessor#postProcessBeanFactory,迭代容器的中的类定义,进行修改
具体如何修改就通过钩子processProperties交由子类实现
4.PlaceholderConfigurerSupport
使用visitor设计模式,通过BeanDefinitionVisitor和StringValueResolver更新属性
StringValueResolver是一个转化String类型数据的接口,真正更新属性的api实现竟然是在
PropertyPlaceholderHelper#parseStringValue
5.PropertySourcesPlaceholderConfigurer
覆写postProcessorBeanFactory api定义解析流程
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。