public abstract class PropertiesLoaderSupport
public class PropertiesFactoryBean extends PropertiesLoaderSupport implements FactoryBean<Properties>, InitializingBean
public abstract class PropertyResourceConfigurer extends PropertiesLoaderSupport implements BeanFactoryPostProcessor, PriorityOrdered
public abstract class PlaceholderConfigurerSupport extends PropertyResourceConfigurer implements BeanNameAware, BeanFactoryAware
public class PropertyPlaceholderConfigurer extends PlaceholderConfigurerSupport
public class PreferencesPlaceholderConfigurer extends PropertyPlaceholderConfigurer implements InitializingBean
public class PropertySourcesPlaceholderConfigurer extends PlaceholderConfigurerSupport implements EnvironmentAware
public class PropertyOverrideConfigurer extends PropertyResourceConfigurer
1、 PropertiesLoaderSupport的mergeProperties方法混合从文件读取(使用loadProperties方法)的和自身设置进去的property,
2、 PropertiesFactoryBean实现了FactoryBean,用来生产Properties,可以配置是否单例
3、PropertyResourceConfigurer
BeanFactoryPostProcessor 实现该接口,可以在spring的bean创建之前,修改bean的定义属性。也就是说,Spring允许BeanFactoryPostProcessor
在容器实例化任何其它bean之前读取配置元数据,并可以根据需要进行修改,例如可以把bean的scope从singleton改为prototype,也可以把property的值给修改掉。
可以同时配置多个BeanFactoryPostProcessor,并通过设置'order'属性来控制各个BeanFactoryPostProcessor的执行次序。
PropertyResourceConfigurer 的postProcessBeanFactory方法,做了一次property的转换,提供了一个protect方法convertPropertyValue(自身未做转换)
然后提供了一个虚方法processProperties(ConfigurableListableBeanFactory beanFactory, Properties props)供子类重写
4、PlaceholderConfigurerSupport
设置了替换值的前缀,后缀比如${}
没有实现父方法processProperties
提供了一个doProcessProperties(ConfigurableListableBeanFactory beanFactoryToProcess,StringValueResolver valueResolver)
这个方法里面拿出说有的BeanDefinition根据一定规则做了修改(visitor.visitBeanDefinition(bd)),比如替换掉${}的属性
public void visitBeanDefinition(BeanDefinition beanDefinition) {
visitParentName(beanDefinition);
visitBeanClassName(beanDefinition);
visitFactoryBeanName(beanDefinition);
visitFactoryMethodName(beanDefinition);
visitScope(beanDefinition);
visitPropertyValues(beanDefinition.getPropertyValues());
ConstructorArgumentValues cas = beanDefinition.getConstructorArgumentValues();
visitIndexedArgumentValues(cas.getIndexedArgumentValues());
visitGenericArgumentValues(cas.getGenericArgumentValues());
}
5、PropertyPlaceholderConfigurer
实现了processProperties 构造了StringValueResolver valueResolver = new PlaceholderResolvingStringValueResolver(props);
调用父方法doProcessProperties