如何在spring应用程序中从数据库而不是属性文件加载属性

时间:2017-06-30 16:03:17

标签: java spring

我正在尝试编写一个批处理应用程序,我需要从数据库而不是属性文件加载属性,然后保留在内存中直到进程完成。实施它的最佳方法是什么?

1 个答案:

答案 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));
    }
}

我相信这是最简单的方法。