Spring 占位符placeholder的实现原理
2021-03-01 16:28
标签:修改 lap 持久 prope script ring bcp visit display 背景:在使用持久化配置中心时,用到一个组件,该组件支持在代码中直接通过@DynamicValue(“指定的KEY名称”)方式,来直接获取配置的key对应的Value值。 占位符格式为${property-name},占位符在运行时,会被替换为propetry-value。一般环境相关的属性会用到占位符,属性以key=value格式定义在xxx.properties文件中,来减少对部署代码的更改。 应用场景有:数据库URLS、密码配置。 先从UML图认识下PropertySourcesPlaceholderConfigurer,下图中,比较重要的两个接口:BeanFactoryPostProcessor, Ordered。 BeanFactoryPostProcessor 能读取Bean配置元数据、在IOC容器实例化Bean之前修改其配置元数据。即将Bean中的占位符替换掉。 Ordered 能控制多个BeanFactoryPostProcessor的执行顺序。 围绕着重要接口继续展开UML图如下,从下图可以看出: BeanFactoryPostProcessor接口是具体实现是在PropertySourcesPlaceholderConfigurer类中,PropertySourcesPlaceholderConfigurer.postProcessBeanFactory方法。 Ordered接口是具体实现在PropertyResourceConfigurer类中,PropertyResourceConfigurer.getOrder方法。 PropertySourcesPlaceholderConfigurer.postProcessBeanFactory 方法源码解析如下。除了主流程外,流程中出现较多的是各种valueResolver, 见名知意先不用分析,后面可以分析下其设计模式。 PropertyResourceConfigurer.getOrder方法源码解析如下。 背景:在使用持久化配置中心时,用到了同事写的组件。 该组件支持在代码中直接通过@DynamicValue(“指定的KEY名称”)方式,来直接获取配置的key对应的Value值。 Spring 占位符placeholder的实现原理 标签:修改 lap 持久 prope script ring bcp visit display 原文地址:https://www.cnblogs.com/dameiwujaing/p/14422689.html1. 占位符是什么?应用场景有哪些?
context:property-placeholder location="classpath:placeholder.properties"/>
bean id="dataSource" destroy-method="close"
class="org.apache.commons.dbcp.BasicDataSource">
property name="driverClassName" value="${jdbc.driverClassName}"/>
property name="url" value="${jdbc.url}"/>
property name="username" value="${jdbc.username}"/>
property name="password" value="${jdbc.password}"/>
bean>
2. Spring是如何实现占位符-PropertySourcesPlaceholderConfigurer?
/**
* 用configurer的PropertySource集合,来替换Bean定义中的占位符${...}
* PropertySource包含以下内容:
* 1. 所有的environment property source,即Environment属性
* 2. 合并后的local properties,可通过#setLocation\#setLocations\#setProperties\setPropertiesArray等方法指定值
* 3. 通过调用#setPropertySources方法设置的ProperySources,若该方法被调用environment、local properties会被忽略,这个方法设计目标是为用户提供细粒度的控制。一旦设置,不会添加其他的sources.
*/
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// 创建PropertySource, 加载Environment属性、加载local properties
if (this.propertySources == null) {
this.propertySources = new MutablePropertySources();
if (this.environment != null) {
// 加载Environment属性
this.propertySources.addLast(
new PropertySource
// 默认最低优先级,等同于未排序
private int order = Ordered.LOWEST_PRECEDENCE;
/**
* 需要排序的话,设置该值
* @see PriorityOrdered
*/
public void setOrder(int order) {
this.order = order;
}
@Override
public int getOrder() {
return this.order;
}
3.整合持久化配置中心&Spring占位符