spring管理属性配置文件properties——使用PropertiesFactoryBean

对于属性配置,一般采用的是键值对的形式,如:
key=value
属性配置文件一般使用的是XXX.properties,当然有时候为了避免eclipse把properties文件转码,放到服务器上认不出中文,可以采用XXX.conf的形式管理属性配置。
spring对于属性文件有自己的管理方式,通过spring的管理,可以直接使用@Value的方式直接得到属性值。
先使用org.springframework.beans.factory.config.PropertiesFactoryBean对属性配置文件进行管理。
1.新建一个java project,命名spring_test;

2.导入jar包:
aopalliance-1.0.jar
commons-logging-1.1.1.jar
org.springframework.test-3.1.0.RELEASE.jar
spring-aop-3.1.1.RELEASE.jar
spring-asm-3.1.1.RELEASE.jar
spring-beans-3.1.1.RELEASE.jar
spring-context-3.1.1.RELEASE.jar
spring-context-support-3.1.1.RELEASE.jar
spring-core-3.1.1.RELEASE.jar
spring-expression-3.1.1.RELEASE.jar

3.在src下新建一个config.propertites:
author_name=lee

4.新建一个文件夹config;

5.新建一个app.conf:
project_info=项目

6.新建一个spring配置文件applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context-3.0.xsd">
 
	<context:annotation-config />
	<context:component-scan base-package="com.*"></context:component-scan>
 
	<!-- 使用注解注入properties中的值 -->
    <bean id="setting"
        class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <property name="locations">
            <list>
                <value>classpath:*.properties</value>
                <value>file:config/*.conf</value>
            </list>
        </property>
        <!-- 设置编码格式 -->
        <property name="fileEncoding" value="UTF-8"></property>
    </bean>
</beans>

7.新建一个获取属性配置文件属性的类ConfigProperty.java:

package com.lee.property.test;
 
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
 
/**
 * config.properties文件映射类
 */
@Component("configProperty")
public class ConfigProperty {
 
	/** 作者名字 */
	@Value("#{setting[author_name]}")
	private String authorName;
	/** 项目信息 */
	@Value("#{setting[project_info]}")
	private String projectInfo;
 
	public String getAuthorName() {
		return authorName;
	}
 
	public void setAuthorName(String authorName) {
		this.authorName = authorName;
	}
 
	public String getProjectInfo() {
		return projectInfo;
	}
 
	public void setProjectInfo(String projectInfo) {
		this.projectInfo = projectInfo;
	}
}

8.新建测试类:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
public class ConfigPropertyTest {
 
    @Resource(name = "configProperty")
    private ConfigProperty configProperty;
     
    /**
     * 测试Spring注解获取properties文件的值
     */
    @Test
    public void test() {
        System.out.println(configProperty.getAuthorName());
        System.out.println(configProperty.getProjectInfo());
    }
}

总结:

1.使用org.springframework.beans.factory.config.PropertiesFactoryBean获取属性的方式是:

@Value("${beanid[‘properties_key’]}")

2.使用

<!-- 设置编码格式 -->
<property name="fileEncoding" value="UTF-8"></property>

主要为了解决属性文件中value为中文时乱码的问题

转载文章
原文链接:

spring管理属性配置文件properties——使用PropertyPlaceholderConfigurer

org.springframework.beans.factory.config.PropertyPlaceholderConfigurer也可以管理配置文件。

1.在上一个项目(spring_test)的基础上新建spring配置文件applicationContext2.xml:

<?xml version="1.0" encoding="UTF-8"?>

<context:annotation-config />
<context:component-scan base-package="com.*"></context:component-scan>
<!-- <context:property-placeholder location="file:config/*.conf" ignore-unresolvable="true"/>
<context:property-placeholder location="classpath:*.properties" ignore-unresolvable="true"/> -->

<!-- 使用注解注入properties中的值 -->
<bean id="setting"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="ignoreUnresolvablePlaceholders" value="true" />   
    <property name="locations">
        <list>
            <value>classpath:*.properties</value>
            <value>file:config/*.conf</value>
        </list>
    </property>
    <!-- 设置编码格式 -->
    <property name="fileEncoding" value="UTF-8"></property>
</bean>

2.修改ConfigProperty.java:

@Component("configProperty")
public class ConfigProperty {
 
	/** 作者名字 */
	@Value("${author_name}")
	private String authorName;
	/** 项目信息 */
	@Value("${project_info}")
	private String projectInfo;
 
	public String getAuthorName() {
		return authorName;
	}
 
	public void setAuthorName(String authorName) {
		this.authorName = authorName;
	}
 
	public String getProjectInfo() {
		return projectInfo;
	}
 
	public void setProjectInfo(String projectInfo) {
		this.projectInfo = projectInfo;
	}
 
}

3.新建测试类:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={"classpath:applicationContext2.xml"})
public class ConfigPropertyTest {
 
    @Resource(name = "configProperty")
    private ConfigProperty configProperty;
     
    /**
     * 测试Spring注解获取properties文件的值
     */
    @Test
    public void test() {
        System.out.println(configProperty.getAuthorName());
        System.out.println(configProperty.getProjectInfo());
    }
}

总结:

1.使用PropertiesFactoryBean管理属性文件获取属性的方式:

@Value("${properties_key}")

和org.springframework.beans.factory.config.PropertiesFactoryBean有点不同;
2.在spring配置文件中,对于bean的配置有这样一个配置:

<property name="ignoreUnresolvablePlaceholders" value="true" />

这个主要是为了解决抛出cannot be resolved的异常。

转载文章
原文链接:

可以自己去继承PropertyPlaceholderConfigurer类, 并重写里面的方法去获取配置文件中的内容,对应修改配置文件中的class为继承类.

protected void processProperties(ConfigurableListableBeanFactory beanFactory,  
            Properties props)throws BeansException {  
  
        super.processProperties(beanFactory, props);  
        Map<String, Object> ctxPropertiesMap ctxPropertiesMap = new HashMap<String, Object>();  
        
        //专门负责解析路径中或者名字中含有占位符的字串,并负责填充上具体的值
        PropertyPlaceholderHelper helper = new PropertyPlaceholderHelper(
                DEFAULT_PLACEHOLDER_PREFIX, DEFAULT_PLACEHOLDER_SUFFIX, DEFAULT_VALUE_SEPARATOR, false);
        //load properties to ctxPropertiesMap  
        for (Object key : props.keySet()) {  
            String keyStr = key.toString();  
            String value = props.getProperty(keyStr); 
            value = helper.replacePlaceholders(value, props);
            ctxPropertiesMap.put(keyStr, value);  
        }  
    }

在spring 2.5之后,可以使用

<context:property-placeholder location="classpath:com/foo/jdbc.properties"/>

其本质是注册了一个PropertyPlaceholderConfigurer(3.1之前)或者是PropertySourcesPlaceholderConfigurer(3.1之后)
一般用于在xml文件中对.properties文件中参数的使用,例如数据库连接