我在 application.properties 文件中指定了Spring属性。如何从环境变量中填充这些属性?
这是我尝试过的,但它似乎不起作用:
application.properties
spring.datasource.url=jdbc:postgresql://#{ systemProperties['DATABASE_HOST']}:5432/dbname
spring.datasource.username = postgres
spring.datasource.password = postgres
答案 0 :(得分:7)
您可以使用${...}
语法引用Spring属性的方式引用环境属性。
在你的情况下:
spring.datasource.url=jdbc:postgresql://${DATABASE_HOST}:5432/dbname
答案 1 :(得分:3)
开箱即用,正如您所知,spring-boot期望其数据源详细信息使用一组特定的变量名称。当然,春天你可以通过几种方法重新设计:
1 /如果需要使用来自环境的变量来自部署到云服务(如Cloud Foundry或Horuku),那么有spring-boot-starter-cloud-connector可以处理开箱即用的管道。一个好的阅读是(Binding to Data Services with Spring Boot in Cloud Foundry文章和Deploying to the cloud文档,它们引导您通过此
2 /您可以创建自定义配置bean来覆盖DataSource信息的填充方式,而不是依赖Spring-Boot自己的自动神奇连线机制。可以在此处找到解释相关注释的好读物:Spring Java Config Documentation - @Bean Configuration JavaDOC。根据上面的例子,这是我吐出来的:
@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();
}
}
请记住,在春天,你总是可以通过一点点挖掘来覆盖所有的默认行为!
希望这有帮助!
答案 2 :(得分:2)
你不必。当Spring Boot初始化其环境时,它会从application.properties
文件和任何系统级变量中提取内容并将它们组合在一起。 Spring从中获取的位置的完整列表是here,特别是指向 9)和 10)。