【问题标题】:spring - read environment variables from inside the application.properties filespring - 从 application.properties 文件中读取环境变量
【发布时间】:2016-09-26 12:54:59
【问题描述】:

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

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

application.properties

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

【问题讨论】:

标签: java spring spring-boot


【解决方案1】:

您可以像使用 ${...} 语法引用 Spring 属性一样引用环境属性。

在你的情况下:

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

【讨论】:

  • 我有一个环境变量名称:用户和值:通过。在我的 application.properties 中,我使用了 datasource.username=${user}。它不读取值
  • 在没有设置环境变量的情况下,有没有办法设置默认值?
  • 您可以将默认值放入 application.yml。 env 属性会覆盖它们。他们有更高的优先级
【解决方案2】:

如您所知,开箱即用,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 - @BeanConfiguration 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();
    }
}

请记住,在春季,您始终可以通过一点点挖掘来覆盖分配的默认行为!

希望这会有所帮助!

【讨论】:

    【解决方案3】:

    您不必这样做。当 Spring Boot 初始化其环境时,它会从 application.properties 文件和任何系统级变量中提取内容并将它们组合在一起。 Spring 获取它们的位置的完整列表是 here,特别是点 9)10)

    【讨论】:

    • 很好,但在这种情况下,我不能使用自己的属性名称(由于此处的设置,我必须这样做)
    • 只需移动它们并将DATABASE_HOST分配给SPRING_DATASOURCE_URL等等
    猜你喜欢
    • 2017-03-06
    • 1970-01-01
    • 2021-05-31
    • 2016-06-08
    • 2011-01-16
    • 2022-07-29
    • 2016-11-15
    • 2020-09-18
    • 1970-01-01
    相关资源
    最近更新 更多