spring - 从application.properties文件中读取环境变量

时间:2016-09-26 12:55:00

标签: java spring spring-boot

我在 application.properties 文件中指定了Spring属性。如何从环境变量中填充这些属性?

这是我尝试过的,但它似乎不起作用:

application.properties

spring.datasource.url=jdbc:postgresql://#{ systemProperties['DATABASE_HOST']}:5432/dbname
spring.datasource.username = postgres
spring.datasource.password = postgres

3 个答案:

答案 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)