在一个多租户Sping Boot 应用程序中,我正在尝试加载配置对象。理想情况下,我希望通过编程方式将某些属性文件加载到配置对象中。我正在寻找一种简单的方法,通过传递一个属性文件和最终的类来加载配置。以下只是我尝试实现的一个示例。
配置的目录结构:
config/
- common.properties
all_tenants_config/
- foo_tenant/
- database.properties
- api.properties
- bar_tenant/
- database.properties
- api.properties
配置POJO:
class DatabaseProperties {
@Value("${database.url}")
private String url;
}
class APIProperties {
@Value("${api.endPoint}")
private String endPoint;
}
配置提供程序:
@Singleton
class ConfigurationProvider {
private Map<String, DatabaseProperties> DB_PROPERTIES = new HashMap<>();
private Map<String, APIProperties> API_PROPERTIES = new HashMap<>();
public ConfigurationProvider(@Value(${"tenantsConfigPath"}) String tenantsConfigPath) {
for (File tenant : Path.of(tenantsConfigPath).toFile().listFiles()) {
String tenantName = tenant.getName();
for (File configFile : tenant.listFiles()) {
String configName = configFile.getName();
if ("database.properties".equals(configName)) {
// This is what I'm looking for. An easy way to load the configuration by passing a properties file and the final class to map it to.
DB_PROPERTIES.put(tenant, SPRING_CONFIG_LOADER.load(configFile, DatabaseProperties.class));
} else if ("api.properties".equals(configName)) {
API_PROPERTIES.put(tenant, SPRING_CONFIG_LOADER.load(configFile, API.class));
}
}
}
}
public currentTenantDBProperties() {
return DB_PROPERTIES.get(CURRENT_TENANT_ID);
}
public currentTenantAPIProperties() {
return API_PROPERTIES.get(CURRENT_TENANT_ID);
}
}
简而言之,Spring中是否有一种方法允许将属性文件Map到对象,而不使用默认的Spring配置注解?
1条答案
按热度按时间0kjbasz61#
在这种情况下,您不需要任何Spring的特性。
Spring是一个bean容器,但是在这个地方你只需要自己新建一个对象,然后把它放在你的Map缓存上。
步骤1:将属性文件解码为Java属性类对象
第二步:将属性对象转换为目标对象,只需使用一些实用工具,如objectmapper