Spring Boot属性解析

时间:2018-07-10 15:45:24

标签: spring-boot

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

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

3 个答案:

答案 0 :(得分:1)

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

  

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

     
      
  1. 当前目录的/config子目录
  2.   
  3. 当前目录
  4.   
  5. 类路径/config
  6.   
  7. classpath根
  8.   
     

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

您在project/config中的文件在上面的列表中为1,而在project/src/main/resources中的文件在列表中为4。因此,可以预料的是,将使用project/config中文件中的值。

  

project/config中的文件是用于其他环境而非开发人员的文件

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

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

答案 1 :(得分: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);
}

答案 2 :(得分:0)

Spring的@Value注释提供了一种方便的方法来将属性值注入到组件中。

基本语法:

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

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

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

更多详细信息here