gpt4 book ai didi

java - 从数据库中检索 Spring Boot 配置

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:19:49 25 4
gpt4 key购买 nike

谁能为我提供一些实现此目标的最佳方法的指导。

我想扩展 Spring Boot Externalized Configuration这样我就有了一个可以从我的应用程序中的任何地方调用的方法。此方法将使用键检索属性值。此方法将首先查询数据库表,如果未找到指定的键,它将返回到 1 中描述的 PropertySource 顺序。 .

所以我会提供类似于以下的服务:

@Service
public class ConfigurationService {

private final ConfigurationRepository configurationRepository;

@Autowired
public ConfigurationService(ConfigurationRepository configurationRepository) {
this.configurationRepository = configurationRepository;
}

public String getValue(String key) {
Configuration configuration = configurationRepository.findOne(key);

// Add something here to get the property from application.properties if the key does not exist in the db

return configuration == null ? null : configuration.getValue();
}

}

我可以按如下方式使用:

foo = configuration.getValue("my.property");

有没有更好的方法来解决这个问题?我是否缺少可以利用的 Spring Boot 功能?

我希望能够在应用程序运行时更改属性值并获取这些新值。

最佳答案

我已经使用 EnvironmentPostProcessor spring 功能来执行此操作。

你需要像这样创建一个类:

public class ReadDbPropertiesPostProcessor implements EnvironmentPostProcessor {
/**
* Name of the custom property source added by this post processor class
*/
private static final String PROPERTY_SOURCE_NAME = "databaseProperties";

/**
* Adds Spring Environment custom logic. This custom logic fetch properties from database and setting highest precedence
*/
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
Map<String, Object> propertySource = new HashMap<>();

try {
// Build manually datasource to ServiceConfig
DataSource ds = DataSourceBuilder
.create()
.username(USERNAME) // replace with your config
.password(PASSWORD) // replace with your config
.url(DATASOURCE-URL)// replace with your config
.driverClassName(DRIVER) // replace with your config
.build();

// Fetch all properties
PreparedStatement preparedStatement = ds.getConnection().prepareStatement("SELECT name, value FROM propertyConfig WHERE service = ?");
preparedStatement.setString(1, APP_NAME);

ResultSet rs = preparedStatement.executeQuery();

// Populate all properties into the property source
while (rs.next()) {
String propName = rs.getString("name");
propertySource.put(propName, rs.getString("value"));
}

// Create a custom property source with the highest precedence and add it to Spring Environment
environment.getPropertySources().addFirst(new MapPropertySource(PROPERTY_SOURCE_NAME, propertySource));

} catch (Exception e) {
throw new RuntimeException("Error fetching properties from db");
}
}
}

由于您需要在 spring 的早期阶段运行此类,因此您需要创建文件 spring.factories 并注册您的环境后处理器。该文件需要位于此处:

src/main/resources/META-INF/spring.factories

在内容中你需要设置你的class为spring属性:

# Environment Post Processor
org.springframework.boot.env.EnvironmentPostProcessor=com.your.package.ReadDbPropertiesPostProcessor

关于java - 从数据库中检索 Spring Boot 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30212633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com