0

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

      @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 应用程序时,我希望这段代码能够从类路径中的 application.properties 获取属性(在 project/src/main/resources 中),但它使用的是另一个 application.properties在项目/配置中,为什么会发生这种情况以及如何防止这种行为?(project/config 中的文件是其他环境的文件,而不是 dev)。

4

3 回答 3

1

你无法阻止你看到的行为。application.properties文件的优先顺序在文档中描述

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 文件中。因此,该位置更适合您的应用程序在开发之外使用的属性。

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

于 2018-07-10T20:27:44.610 回答
0

在 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);
}
于 2018-07-10T18:21:17.223 回答
0

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

基本语法:

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

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

类似地,您必须注入所有提到的属性,并在创建 bean 时使用它。

更多细节在这里

于 2018-07-10T18:33:39.427 回答