关于spring属性占位符用法

 更新时间:2023年11月27日 10:57:48   作者:爱艺欣聊编程  
这篇文章主要介绍了关于spring属性占位符用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

在bean定义时设置bean属性的值时,除了设置固定的值,还可以通过EL表达式和占位符来设置,容器在解析bean定义时会对EL表达式和占位符进行解析求值。

本篇来学习一下通过占位符定义属性的用法。

占位符的取值范围有三个:

  • 系统变量(System.getProperty)
  • 坏境变量(System.getEnv)
  • 自定义的Properties文件

Spring提供了三种方式来配置加载自定义的properties:

1、PropertyPlaceholderConfigurer

一个BFPP,通过location属性把properties文件的路径传入,并且可以设置系统变量加载模式,有三种:

  • 不检查系统属性;
  • 优先加载自定义属性,加载不到时加载系统属性;
  • 优先加载系统属性,加载不到时再加载自定义属性。通过systemPropertiesMode设置加载模式。占位符的前后缀默认是${和},但是可以通过设置placeholderPrefix和placeholderSuffix来修改前后缀。

PropertyPlaceholderConfigurer的用法如下:

bean定义xml:

<bean
	class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
	<property name="location">
		<value>classpath:spring/beans/placeholder/attr.properties</value>
	</property>
	<property name="placeholderPrefix" value="${"></property>
	<property name="placeholderSuffix" value="}"></property>
</bean>
<bean id="placeHolderBean" class="spring.beans.placeholder.PlaceHolderBean">
	<property name="id" value="${placeholder.id}"></property>
	<property name="name" value="${placeholder.name}"></property>
	<property name="refBean" ref="${placeholder.ref}"></property>
</bean>
<bean id="refedBean" class="spring.beans.placeholder.RefedBean"></bean>

自定义属性文件attr.properties:

placeholder.id = 123
placeholder.name = cyy
placeholder.ref = refedBean

2、PropertySourcesPlaceholderConfigurer

和PropertyPlaceholderConfigurer类似,但是它不能设置系统属性加载模式,而是通过localOverride属性来决定是否用自定义的属性来覆盖系统属性。

3、context:property-placeholder标签

spring设计了context:property-placeholder标签来简化配置,它的原理跟上面两种方式是一样的,通过location属性设置属性文件路径,如有多个用逗号分隔。

容器通过PropertyPlaceholderBeanDefinitionParser解析该标签,在解析时会把这个标签解析成PropertyPlaceholderConfigurer或PropertySourcesPlaceholderConfigurer,当system-properties-mode设置为ENVIRONMENT系统变量优先时使用PropertySourcesPlaceholderConfigurer,否则使用PropertyPlaceholderConfigurer,

下面是这个标签的用法:

<context:property-placeholder
	location="classpath:spring/beans/placeholder/attr.properties" />
<bean id="placeHolderBean" class="spring.beans.placeholder.PlaceHolderBean">
	<property name="id" value="${placeholder.id}"></property>
	<property name="name" value="${placeholder.name}"></property>
	<property name="refBean" ref="${placeholder.ref}"></property>
</bean>
<bean id="refedBean" class="spring.beans.placeholder.RefedBean"></bean>

属性配置器在加载完自定义属性之后会创建一个字符值处理器StringValueResolver,并且把加载到的属性设置到这个处理器中,遍历当前容器中所有的bean定义,使用这个处理来处理属性中未处理的占位符以及别名中的占位符,并且把该处理添加到容器中,为后面的bean解析提供占位符处理,见PlaceholderConfigurerSupport类中doProcessProperties方法的代码:

protected void doProcessProperties(ConfigurableListableBeanFactory beanFactoryToProcess,
		StringValueResolver valueResolver) {
 
	BeanDefinitionVisitor visitor = new BeanDefinitionVisitor(valueResolver);
 
	String[] beanNames = beanFactoryToProcess.getBeanDefinitionNames();
	for (String curName : beanNames) {
		// Check that we're not parsing our own bean definition,
		// to avoid failing on unresolvable placeholders in properties file locations.
		if (!(curName.equals(this.beanName) && beanFactoryToProcess.equals(this.beanFactory))) {
			BeanDefinition bd = beanFactoryToProcess.getBeanDefinition(curName);
			try {
				visitor.visitBeanDefinition(bd);
			}
			catch (Exception ex) {
				throw new BeanDefinitionStoreException(bd.getResourceDescription(), curName, ex.getMessage(), ex);
			}
		}
	}
 
	// New in Spring 2.5: resolve placeholders in alias target names and aliases as well.
	beanFactoryToProcess.resolveAliases(valueResolver);
 
	// New in Spring 3.0: resolve placeholders in embedded values such as annotation attributes.
	beanFactoryToProcess.addEmbeddedValueResolver(valueResolver);
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • JAVA利用顺序表实现“杨辉三角”的思路及代码示例

    JAVA利用顺序表实现“杨辉三角”的思路及代码示例

    杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,这篇文章主要介绍了JAVA利用顺序表实现杨辉三角的思路及代码示例,需要的朋友可以参考下
    2025-01-01
  • Java内存溢出案例模拟和原理分析过程

    Java内存溢出案例模拟和原理分析过程

    这篇文章主要介绍了Java内存溢出案例模拟和原理分析过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Java servlet 使用 PrintWriter 时的编码与乱码的示例代码

    Java servlet 使用 PrintWriter 时的编码与乱码的示例代码

    本篇文章主要介绍了Java servlet 使用 PrintWriter 时的编码与乱码的示例代码,探讨了 PrintWriter 的缺省编码与普通字符流的缺省编码的差异,具有一定的参考价值,有兴趣的可以了解一下
    2017-11-11
  • SpringBoot引入模板引擎实现视图解析

    SpringBoot引入模板引擎实现视图解析

    这篇文章主要介绍了SpringBoot引入模板引擎实现视图解析方法流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-10-10
  • java使用sigar 遇到问题的快速解决方法

    java使用sigar 遇到问题的快速解决方法

    下面小编就为大家带来一篇java使用sigar 遇到问题的快速解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • mybatis-plus实现逻辑删除的示例代码

    mybatis-plus实现逻辑删除的示例代码

    本文主要介绍了mybatis-plus实现逻辑删除的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • java实现同步回调的示例代码

    java实现同步回调的示例代码

    同步回调是一种在调用代码中同步执行回调函数的编程模式,在Java中,通过定义和实现接口来构建同步回调,本文就来介绍一下如何实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-09-09
  • 浅谈Java虚拟机对内部锁的四种优化方式

    浅谈Java虚拟机对内部锁的四种优化方式

    这篇文章主要介绍了浅谈Java虚拟机对内部锁的四种优化方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Java模糊查询方法详解

    Java模糊查询方法详解

    这篇文章主要为大家详细介绍了Java模糊查询方法的实现,实例教你如何用Java做模糊查询结果,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • springboot中的多个application文件讲解

    springboot中的多个application文件讲解

    这篇文章主要介绍了springboot中的多个application文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09

最新评论