【问题标题】:Spring boot property resolutionSpring Boot 属性解析
【发布时间】:2018-12-18 13:10:44
【问题描述】:

我正在使用此配置代码来初始化数据源:

      @Bean(destroyMethod = "close")
      DataSource dataSource(Environment env) {
        HikariConfig dataSourceConfig = new HikariConfig();

        dataSourceConfig.setDriverClassName(env.getRequiredProperty(PROP_DB_DRIVER_CLASS));    
        dataSourceConfig.setJdbcUrl(env.getRequiredProperty(PROP_DB_URL));
        dataSourceConfig.setUsername(env.getRequiredProperty(PROP_DB_USER));
        dataSourceConfig.setPassword(env.getRequiredProperty(PROP_DB_PASSWORD));

        return new HikariDataSource(dataSourceConfig);    
      }

“env”是:“org.springframework.core.env.Environment”

现在,当我在 Eclipse 中运行我的 Spring Boot 应用程序时,我希望这段代码能够从位于类路径(在 project/src/main/resources 中)的 application.properties 中获取属性,但它正在使用其他应用程序。项目/配置中的属性,为什么会发生这种情况以及如何防止这种行为? (project/config 中的文件是其他环境的文件,而不是 dev)。

【问题讨论】:

    标签: spring-boot


    【解决方案1】:

    您无法阻止您所看到的行为。 application.properties文件的优先顺序是described in the documentation

    SpringApplication 从以下位置的application.properties 文件中加载属性并将它们添加到 Spring 环境中:

    1. 一个/config当前目录的子目录
    2. 当前目录
    3. 类路径/config
    4. 类路径根

    列表按优先级排序(在列表中较高位置定义的属性会覆盖在较低位置定义的属性)。

    project/config 中的文件在上述列表中为 1,project/src/main/resources 中的文件在列表中为 4。因此,预计会使用 project/config 文件中的值。

    project/config 中的文件是用于其他环境的文件,而不是 dev

    这似乎暗示您认为src/main/resources 中的文件用于开发。默认情况下,它会在该位置打包到应用程序的 jar 文件中。因此,该位置更适合您的应用程序在开发之外使用的属性。

    您可以颠倒您对这两个位置的使用。将您的开发时间属性放在projectproject/config 的文件中,将其他环境的属性放在src/main/resources 的文件中。

    【讨论】:

    • 我以为只有在部署应用程序时才会使用“/config”位置。我将把它重命名为“conf”然后我做什么。关于您的建议,我无法逆转:我的默认属性在 src/main/resources 中,我的 config/*.properties 仅覆盖某些属性。
    【解决方案2】:

    Spring 的@Value 注解提供了一种将属性值注入组件的便捷方式。

    基本语法:

    @Value("${some.key:my default value}")
    private String stringWithDefaultValue;
    

    如果some.key无法解析,则stringWithDefaultValue会被设置为“我的默认值”的默认值。

    类似的方式,你必须注入所有提到的你需要的属性,并在创建 bean 时使用它。

    更多详情here

    【讨论】:

      【解决方案3】:

      在 Spring Boot 中,要从 project/src/main/resources/application.properties 中获取配置值,我们可以使用 @Value

      @Value("${PROP_DB_DRIVER_CLASS}")
      private String drivercClass;
      @Value("${PROP_DB_URL}")
      private String dbUrl;
      @Value("${PROP_DB_USER}")
      private String dbUser;
      @Value("${PROP_DB_PASSWORD}")
      private String dbPassword;
      
      @Bean(destroyMethod = "close")
      DataSource dataSource() {
          HikariConfig dataSourceConfig = new HikariConfig();
      
          dataSourceConfig.setDriverClassName(drivercClass);
          dataSourceConfig.setJdbcUrl(dbUrl);
          dataSourceConfig.setUsername(dbUser);
          dataSourceConfig.setPassword(dbPassword);
      
          return new HikariDataSource(dataSourceConfig);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-11
        • 1970-01-01
        • 2023-04-11
        • 2021-03-08
        • 1970-01-01
        • 1970-01-01
        • 2021-11-10
        相关资源
        最近更新 更多