${...} placeholders in other beans in your configuration.
First, you need to create a PropertySourcesPlaceholderConfigurer bean as shown below:
import org.springframework.context.annotation.*;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
/**
* Loads properties from a file called ${APP_ENV}.properties
* or default.properties if APP_ENV is not set.
*/
@Configuration
@PropertySource("classpath:${APP_ENV:default}.properties")
public class PropertyPlaceholderConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
Next, import this configuration into your main application config and use @Value to resolve the ${...} placeholders. For example, in the code below, the databaseUrl variable will be set from the db.url property in the properties file.
import javax.sql.DataSource;
import org.springframework.context.annotation.*;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
@Configuration
@Import(PropertyPlaceholderConfig.class)
public class AppConfig {
@Value("${db.url}") private String databaseUrl;
@Value("${db.user}") private String databaseUser;
@Value("${db.password}") private String databasePassword;
@Bean
public DataSource personDataSource(){
final DataSource ds = new org.apache.commons.dbcp.BasicDataSource();
ds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
ds.setUrl(databaseUrl);
ds.setUsername(databaseUser);
ds.setPassword(databasePassword);
return ds;
}
@Bean
public PersonDao personDao() {
return new PersonDao(personDataSource());
}
}
Alternative approach: Alternatively, you can load the properties file into the Spring
Environment and then lookup the properties you need when creating your beans:
import javax.sql.DataSource;
import org.springframework.context.annotation.*;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.env.Environment;
@Configuration
@PropertySource("classpath:${APP_ENV:default}.properties")
public class AppConfig {
@Autowired
private Environment env;
@Bean
public DataSource personDataSource() {
final DataSource ds = new org.apache.commons.dbcp.BasicDataSource();
ds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
ds.setUrl(env.getProperty("db.url"));
ds.setUsername(env.getProperty("db.user"));
ds.setPassword(env.getProperty("db.password"));
return ds;
}
@Bean
public PersonDao personDao() {
return new PersonDao(personDataSource());
}
}
A minor downside of this approach is that you need to autowire the Environment into all your configs which require properties from the properties file.
Related posts: Spring 3: JavaConfig vs XML Config