Spring Boot应用程序中的动态数据库重新配置

时间:2016-05-26 17:20:56

标签: java spring spring-mvc spring-boot

我有一个非常复杂的Spring Boot应用程序(包括Spring MVC和Security),其中包括数据库配置(url,用户名和密码)。要求是让最终用户在应用程序本身的帮助下配置数据库,如下所示:

  1. 用户启动尚未配置数据库的应用程序
  2. 应用程序注意到没有数据库配置,并向用户显示配置屏幕
  3. 用户输入网址和凭据
  4. 应用程序开始使用此DB
  5. 显而易见的问题是,在知道配置之前,我无法创建需要DataSource的任何需要数据库配置的bean。

    在执行第一个配置步骤之前,有没有办法推迟大多数应用程序bean的初始化?

    - 更新 - 几个应用程序的bean在其@PostConsutrct方法中从DB初始化它们的状态。所以我要么真的要延迟他们的创建,要么在提供配置后有一个方法(可能)刷新应用程序上下文中的所有bean。

2 个答案:

答案 0 :(得分:1)

我建议您考虑使用另一个模块/程序或简单的脚本来提供所有详细信息,例如数据库等,将此信息存储到您的application.properties文件中(可能有用的是外部化配置Spring boot external configuration )然后使用已有的数据源信息启动主程序。这可能是一种更简单的方法。

答案 1 :(得分:0)

正如您可能预期的那样,在创建Spring Application Context时需要#!/bin/bash while IFS= read -r -d '' name && IFS= read -r content; do printf 'app="%s" | input="%s"\n' "$name" "$content" done < <(grep -r --null --include "inputs.conf" "\[") 的实例。

我建议你继承Spring javax.sql.DataSource并使用空方法覆盖org.springframework.jdbc.datasource.DelegatingDataSource(如果你还没有提供数据源,则默认实现会抛出错误)。当用户提供您需要选择数据库的详细信息时,您可以稍后将最终数据源注入afterPropertiesSet

来源:https://github.com/spring-projects/spring-framework/blob/master/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/DelegatingDataSource.java