我正在使用此配置代码初始化数据源:
@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的文件。)
答案 0 :(得分:1)
您无法阻止所看到的行为。 application.properties
个文件的优先顺序为documentation:
SpringApplication
从以下位置的application.properties
文件中加载属性,并将它们添加到Spring Environment:
- 当前目录的
/config
子目录- 当前目录
- 类路径
/config
包- classpath根
列表按优先级排序(在列表较高位置定义的属性会覆盖在较低位置定义的属性)。
您在project/config
中的文件在上面的列表中为1,而在project/src/main/resources
中的文件在列表中为4。因此,可以预料的是,将使用project/config
中文件中的值。
project/config
中的文件是用于其他环境而非开发人员的文件
这似乎意味着您认为src/main/resources
中的文件用于开发。默认情况下,它将在该位置打包在应用程序的jar文件中。因此,该位置更适合应用程序在开发之后将使用的属性。
您可以撤消对这两个位置的使用。将开发时间属性放在project
或project/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