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

8

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

以下是我尝试的方法,但似乎不起作用:

application.properties

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

3个回答

10

您可以使用${...}语法与引用Spring属性相同的方式引用环境属性。

在您的情况下:

spring.datasource.url=jdbc:postgresql://${DATABASE_HOST}:5432/dbname

2
我有一个环境变量名为:user,值为:pass。在我的application.properties文件中,我使用了datasource.username=${user}。但它没有读取到这个值。 - JayC
1
如果环境变量未设置,有没有设置默认值的方法? - Ganesh Satpute
您可以将默认值放在application.yml中。 环境属性会覆盖它们。 它们具有更高的优先级。 - Maciej Walkowiak

4

众所周知,spring-boot默认情况下希望其数据源细节使用特定的变量名称。当然,作为spring,如果需要,您可以通过几种方法重新设计它:

1/ 如果需要使用来自环境的变量来自于部署到云服务(如Cloud Foundry或Horuku),则有spring-boot-starter-cloud-connector可以处理很多基础设施。阅读好的文章是在Cloud Foundry中使用Spring Boot绑定数据服务部署到云端文档,这将指导您完成此操作。

2/ 不要依赖于Spring-Boot自己的自动装配机制,您可以创建一个自定义配置bean来覆盖如何填充DataSource信息。这里有一篇很好的阅读材料,解释了涉及的注释: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

不需要。当Spring Boot初始化其环境时,它会从application.properties文件和任何系统级变量中获取内容并将它们组合起来。Spring从哪些位置获取它们的完整列表在这里,具体是第9)和第10)点。


很不错,但在这种情况下我不能使用自己的属性名称(由于此处的设置,我必须使用它们)。 - Oleg
只需将它们移动并将 DATABASE_HOST 分配给 SPRING_DATASOURCE_URL 等即可。 - rorschach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接