Spring boot Spring启动属性解析

Spring boot Spring启动属性解析,spring-boot,Spring Boot,我正在使用此配置代码初始化数据源: @Bean(destromethod=“close”) 数据源数据源(环境环境){ HikariConfig数据源配置=新HikariConfig(); dataSourceConfig.setDriverClassName(env.getRequiredProperty(PROP_DB_DRIVER_CLASS)); dataSourceConfig.setJdbcUrl(env.getRequiredProperty(PROP_DB_URL)); data

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

@Bean(destromethod=“close”)
数据源数据源(环境环境){
HikariConfig数据源配置=新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));
返回新的HikariDataSource(dataSourceConfig);
}
“env”是:“org.springframework.core.env.Environment”


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

在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);
}

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

基本语法:

@Value("${some.key:my default value}")
private String stringWithDefaultValue;
如果无法解析
some.key
,则stringWithDefaultValue将设置为默认值“我的默认值”

类似地,您必须注入所需的所有属性,并在创建bean时使用这些属性


更多细节

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

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

  • 当前目录的
    /config
    子目录
  • 当前目录
  • 类路径
    /config
  • 类路径根
  • 列表按优先级排序(在列表中较高位置定义的特性将覆盖在较低位置定义的特性)

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

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

    这似乎意味着您认为<>代码>文件SRC/main /Reals<代码>是为了开发。默认情况下,它将被打包在应用程序的jar文件中。因此,该位置更适合应用程序在开发之后使用的属性

    您可以反向使用这两个位置。将您的开发时属性放在
    project
    project/config
    中的一个文件中,并将其他环境的属性放在
    src/main/resources
    中的一个文件中。我想只有在部署应用程序时才会使用“/config”位置。我只是将它重命名为“conf”,然后我会做什么。关于你的建议,不,我不能逆转:我的默认属性在src/main/resources中,我的config/*。属性只覆盖一些属性。