Spring PropertyPlaceholderConfigurer and context:property-placeholder


I have following bean declaration:

        <property name="locations">
        <property name="ignoreResourceNotFound" value="true"/>
<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}" />

Now I want to change above PropertyPlaceholderConfigurer to following format:

<context:component-scan base-package="org.example.config"/>
<util:properties id="jdbcProperties" 
  1. ignoreResourceNotFound will ignore the property while running. e.g:
    When testing application WEB-INF/.. path will ignore( since maven
    project and property file is under src/main/resources/..), while
    launching web application, other property will ignore path, I need
    to implement same with above format.
  2. should be able to add multiple property file like
    database.properties, test.properties etc.
  3. in Spring 3, can I use annotation instead of these xml files for DB
    loading, how can I do it? since I am using only one xml file(given
    above) to load db stuff.

I am using Spring 3 framework.

Best Solution

<context:property-placeholder ... /> is the XML equivalent to the PropertyPlaceholderConfigurer. So, prefer that. The <util:properties/> simply factories a java.util.Properties instance that you can inject.

In Spring 3.1 (not 3.0...) you can do something like this:

public class ServiceConfiguration { 

    @Autowired Environment environment; 

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

In Spring 3.0, you can "access" properties defined using the PropertyPlaceHolderConfigurer mechanism using the SpEl annotations:

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

If you want to remove the XML all together, simply register the PropertyPlaceholderConfigurer manually using Java configuration. I prefer the 3.1 approach. But, if youre using the Spring 3.0 approach (since 3.1's not GA yet...), you can now define the above XML like this:

public class MySpring3Configuration {     
        public static PropertyPlaceholderConfigurer configurer() { 
             PropertyPlaceholderConfigurer ppc = ...
             return ppc; 

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

Note that the PPC is defined using a static bean definition method. This is required to make sure the bean is registered early, because the PPC is a BeanFactoryPostProcessor - it can influence the registration of the beans themselves in the context, so it necessarily has to be registered before everything else.

Related Question