spring之PropertyPlaceholderConfigurer源码解析
- PropertyPlaceholderConfigurer介绍
- PropertyPlaceholderConfigurer类结构
- 源码解析
-
- PropertyResourceConfigurer实现的BeanFactoryPostProcessor接口源码
- PropertyPlaceholderConfigurer实现父类的processProperties方法源码
- PlaceholderConfigurerSupport.doProcessProperties源码
- BeanDefinitionVisitor.visitBeanDefinition源码
- PlaceholderResolvingStringValueResolver.resolveStringValue源码
- PropertyPlaceholderHelper.replacePlaceholders源码
PropertyPlaceholderConfigurer介绍
上一篇博客spring之BeanFactoryPostProcessor源码解析中,通过源码分析了BeanFactoryPostProcessor的作用,这篇将介绍BeanFactoryPostProcessor的一个应用例子PropertyPlaceholderConfigurer。这里先直接介绍它的作用,然后再通过源码解析介绍。相信大部分人都使用过在spring的xml配置文件配置数据源,通常在配置数据源的ip和password等配置时,我们填写的是占位符,而真正的配置会配置在properties文件中。而PropertyPlaceholderConfigurer的作用就包含了上面说的这种场景,修改beanDefiniton真正的属性值为占位符对应的properties文件中配置的值。
PropertyPlaceholderConfigurer类结构
既然是BeanFactoryPostProcessor的一个例子,那说明PropertyPlaceholderConfigurer是有实现BeanFactoryPostProcessor接口。这里我们先分析一下其类结构
可以看到继承关系PropertyPlaceholderConfigurer->PlaceholderConfigurerSupport->PropertyResourceConfigurer。并且PropertyResourceConfigurer实现了BeanFactoryPostProcessor接口。
源码解析
PropertyResourceConfigurer实现的BeanFactoryPostProcessor接口源码
PropertyResourceConfigurer.java
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
try {
//获取所有属性
Properties mergedProps = mergeProperties();
// Convert the merged properties, if necessary.
//转换合并属性
convertProperties(mergedProps);
// Let the subclass process the properties.
//子类实现属性替换过程
processProperties(beanFactory, mergedProps);
}
catch (IOException ex) {
throw new BeanInitializationException("Could not load properties", ex);
}
}
PropertyPlaceholderConfigurer实现父类的processProperties方法源码
@Override
protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess, Properties props)
throws BeansException {
//将properties属性包装到String解析器PlaceholderResolvingStringValueResolver
//此构造方法在下面的内部类中实现
StringValueResolver valueResolver = new PlaceholderResolvingStringValueResolver(props);
//执行父类PlaceholderConfigurerSupport的doProcessProperties方法
doProcessProperties(beanFactoryToProcess, valueResolver);
}
//内部类
private class PlaceholderResolvingStringValueResolver implements StringValueResolver {
private final PropertyPlaceholderHelper helper;
private final PlaceholderResolver resolver;
public PlaceholderResolvingStringValueResolver(Properties props) {
this.helper = new PropertyPlaceholderHelper(
placeholderPrefix, placeholderSuffix, valueSeparator, ignoreUnresolvablePlaceholders);
this.resolver = new PropertyPlaceholderConfigurerResolver(props);
}
@Override
@Nullable
public String resolveStringValue(String strVal) throws BeansException {
String resolved = this.helper.replacePlaceholders(strVal, this.resolver);
if (trimValues) {
resolved = resolved.trim();
}
return (resolved.equals(nullValue) ? null : resolved);
}
}