spring PropertyPlaceholderConfigurer和context:property-placeholder

时间:2011-09-24 23:05:02

标签: spring

我有以下bean声明:

  <bean
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>WEB-INF/classes/config/properties/database.properties</value>
                <value>classpath:config/properties/database.properties</value>
            </list>
        </property>
        <property name="ignoreResourceNotFound" value="true"/>
    </bean>
<bean id="dataSource" 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>

现在我想将上面的PropertyPlaceholderConfigurer更改为以下格式:

<context:component-scan base-package="org.example.config"/>
<util:properties id="jdbcProperties" 
           location="classpath:config/properties/database.properties"/>
  1. ignoreResourceNotFound将在运行时忽略该属性。例如: 当测试应用程序WEB-INF / ..路径将忽略(因为maven 项目和属性文件在src / main / resources / ..)下,同时 启动Web应用程序,其他属性将忽略路径,我需要 以上述格式实施。
  2. 应该可以添加多个属性文件 database.properties,test.properties等。
  3. 在Spring 3中,我可以使用注释代替DB的这些xml文件 加载,我该怎么办?因为我只使用一个xml文件(给定 以上)加载db stuff。
  4. 我正在使用Spring 3框架。

3 个答案:

答案 0 :(得分:47)

<context:property-placeholder ... />是与PropertyPlaceholderConfigurer等效的XML。所以,更喜欢。 <util:properties/>只是生成一个可以注入的java.util.Properties实例。

在Spring 3.1(不是3.0 ......)中你可以这样做:

@Configuration
@PropertySource("/foo/bar/services.properties")
public class ServiceConfiguration { 

    @Autowired Environment environment; 

    @Bean public javax.sql.DataSource dataSource( ){ 
        String user = this.environment.getProperty("ds.user");
        ...
    } 
}

在Spring 3.0中,您可以使用SpEl注释“访问”使用PropertyPlaceHolderConfigurer机制定义的属性:

@Value("${ds.user}") private String user;

如果要一起删除XML,只需使用Java配置手动注册PropertyPlaceholderConfigurer。我更喜欢3.1方法。但是,如果您使用Spring 3.0方法(因为3.1还不是GA ...),您现在可以像这样定义上面的XML:

@Configuration 
public class MySpring3Configuration {     
        @Bean 
        public static PropertyPlaceholderConfigurer configurer() { 
             PropertyPlaceholderConfigurer ppc = ...
             ppc.setLocations(...);
             return ppc; 
        } 

        @Bean 
        public class DataSource dataSource(
                @Value("${ds.user}") String user, 
                @Value("${ds.pw}") String pw, 
                ...) { 
            DataSource ds = ...
            ds.setUser(user);
            ds.setPassword(pw);                        
            ...
            return ds;
        }
}

请注意,PPC是使用static bean定义方法定义的。这是确保bean早期注册所必需的,因为PPC是BeanFactoryPostProcessor - 它可以影响bean本身在上下文中的注册,所以它必须在其他所有内容之前注册。

答案 1 :(得分:19)

首先,您无需定义这两个位置。只需使用classpath:config/properties/database.properties即可。在WAR中,WEB-INF/classes是一个类路径条目,因此它可以正常工作。

在那之后,我想你的意思是你想use Spring's schema-based configuration to create a configurer。那会是这样的:

<context:property-placeholder location="classpath:config/properties/database.properties"/>

请注意,您不再需要“ignoreResourceNotFound”。如果您需要使用util:properties单独定义属性:

<context:property-placeholder properties-ref="jdbcProperties" ignore-resource-not-found="true"/>

但通常没有任何理由单独定义它们。

答案 2 :(得分:0)

以下为我工作:
<context:property-placeholder location="file:src/resources/spring/AppController.properties"/>

不知怎的&#34; classpath:xxx&#34;没有选择文件。