關(guān)于spring屬性占位符用法
在bean定義時設(shè)置bean屬性的值時,除了設(shè)置固定的值,還可以通過EL表達式和占位符來設(shè)置,容器在解析bean定義時會對EL表達式和占位符進行解析求值。
本篇來學(xué)習(xí)一下通過占位符定義屬性的用法。
占位符的取值范圍有三個:
- 系統(tǒng)變量(System.getProperty)
- 壞境變量(System.getEnv)
- 自定義的Properties文件
Spring提供了三種方式來配置加載自定義的properties:
1、PropertyPlaceholderConfigurer
一個BFPP,通過location屬性把properties文件的路徑傳入,并且可以設(shè)置系統(tǒng)變量加載模式,有三種:
- 不檢查系統(tǒng)屬性;
- 優(yōu)先加載自定義屬性,加載不到時加載系統(tǒng)屬性;
- 優(yōu)先加載系統(tǒng)屬性,加載不到時再加載自定義屬性。通過systemPropertiesMode設(shè)置加載模式。占位符的前后綴默認是${和},但是可以通過設(shè)置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類似,但是它不能設(shè)置系統(tǒng)屬性加載模式,而是通過localOverride屬性來決定是否用自定義的屬性來覆蓋系統(tǒng)屬性。
3、context:property-placeholder標(biāo)簽
spring設(shè)計了context:property-placeholder標(biāo)簽來簡化配置,它的原理跟上面兩種方式是一樣的,通過location屬性設(shè)置屬性文件路徑,如有多個用逗號分隔。
容器通過PropertyPlaceholderBeanDefinitionParser解析該標(biāo)簽,在解析時會把這個標(biāo)簽解析成PropertyPlaceholderConfigurer或PropertySourcesPlaceholderConfigurer,當(dāng)system-properties-mode設(shè)置為ENVIRONMENT系統(tǒng)變量優(yōu)先時使用PropertySourcesPlaceholderConfigurer,否則使用PropertyPlaceholderConfigurer,
下面是這個標(biāo)簽的用法:
<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>
屬性配置器在加載完自定義屬性之后會創(chuàng)建一個字符值處理器StringValueResolver,并且把加載到的屬性設(shè)置到這個處理器中,遍歷當(dāng)前容器中所有的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); }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
JAVA利用順序表實現(xiàn)“楊輝三角”的思路及代碼示例
楊輝三角形是中國古代數(shù)學(xué)的杰出研究成果之一,是我國北宋數(shù)學(xué)家賈憲于1050年首先發(fā)現(xiàn)并使用的,這篇文章主要介紹了JAVA利用順序表實現(xiàn)楊輝三角的思路及代碼示例,需要的朋友可以參考下2025-01-01Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼
本篇文章主要介紹了Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼,探討了 PrintWriter 的缺省編碼與普通字符流的缺省編碼的差異,具有一定的參考價值,有興趣的可以了解一下2017-11-11淺談Java虛擬機對內(nèi)部鎖的四種優(yōu)化方式
這篇文章主要介紹了淺談Java虛擬機對內(nèi)部鎖的四種優(yōu)化方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10