spring之PropertyPlaceholderConfigurer源码解析

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);
		}
	}

PlaceholderConfigurerSupport.doProcessProperties源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值