${...}
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
I am trying to supply a runtime name of the file (my message queue.properties file differs for my different environment)
ReplyDeleteBut I am not able to set the $(hostname} with the name of my hostname for spring application context to load it dynamically.
If you have pointers for the same that would be really helpful
Awesome thanks for the code snippet worked like a charm!!
ReplyDelete