Out of the box, as you know, spring-boot expects its Datasource details to be using a specific set of variable names. Being spring of course you can rework this if you need by a few methods:
1/ If the need to use variables from the environment comes from deployment to a cloud service such as Cloud Foundry or Horuku, there is spring-boot-starter-cloud-connector which handles allot of the plumbing out of the box. A good read is the (Binding to Data Services with Spring Boot in Cloud Foundry article and the Deploying to the cloud docs which walks you thru this
2/ Instead of relying on Spring-Boot's own auto-magical wiring mechanism, you can create a custom configuration bean to override how the DataSource information is populated. A good read explaining the annotations involved can be found here: Spring Java Config Documentation - @Bean Configuration JavaDOC. Based on your example above, here is what I spat out:
@Configuration public class MyDataSourceConfig { @Bean @Primary public DataSource getDataSource() { String url = "jdbc:postgresql://" + System.getenv("DATABASE_HOST") + ":5432/dbname"; String username = "postgres"; String password = "postgres"; String driverClassName = "org.postgresql.Driver"; /* * Create the datasource and return it * * You could create the specific DS * implementation (ie: org.postgresql.ds.PGPoolingDataSource) * or ask Spring's DataSourceBuilder to autoconfigure it for you, * whichever works best in your eyes */ return DataSourceBuilder .create() .url( url ) .username( username ) .password( password ) .driverClassName( driverClassName ) .build(); } }
Just remember that in spring, you can always override allot of the default behaviours with a little bit of digging!
Hope this helps!