我正在尝试编写一个批处理应用程序,我需要从数据库而不是属性文件加载属性,然后保留在内存中直到进程完成。实施它的最佳方法是什么?
答案 0 :(得分:3)
您可以使用ConfigurableEnvironment
组件向现有环境添加自定义属性。
通常通过监听ContextRefreshedEvent
来完全初始化应用程序是有意义的,所以在那一刻,可以从数据库中检索某些内容并与环境合并。
但是你可以将它绑定到你自己的生命周期。
这是一个简单的例子。
假设这是您的数据库属性定义:
@Entity
@Table(name = "database_properties")
public static class DatabaseProperty extends AbstractPersistable<String> {
private String name;
private String value;
public DatabaseProperty() {}
public DatabaseProperty(String name, String value) {
this.name = name;
this.value = value;
}
public String getName() { return name; }
public String getValue() { return value; }
}
使用repository / dao:
interface DatabasePropertyRepository extends JpaRepository<So44850695Application.DatabaseProperty, String> {}
这是您可以将其与现有环境合并的方式:
@Component
public static class PropertyEnvironment implements ApplicationListener<ContextRefreshedEvent> {
private final ConfigurableEnvironment configurableEnvironment;
private final DatabasePropertyRepository propertiesRepository;
@Autowired
public PropertyEnvironment(ConfigurableEnvironment configurableEnvironment,
DatabasePropertyRepository propertiesRepository) {
this.configurableEnvironment = configurableEnvironment;
this.propertiesRepository = propertiesRepository;
}
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
final Map<String, Object> properties = propertiesRepository.findAll().stream()
.collect(Collectors.toMap(DatabaseProperty::getName, DatabaseProperty::getValue));
configurableEnvironment.getPropertySources().addLast(new MapPropertySource("db", properties));
}
}
我相信这是最简单的方法。