启动后定义的 Spring Boot DataSource

Posted

技术标签:

【中文标题】启动后定义的 Spring Boot DataSource【英文标题】:Spring Boot DataSource defined after startup 【发布时间】:2019-03-15 02:51:59 【问题描述】:

我有一个将使用 SQL Server 的 Spring Boot 应用程序。我希望能够在没有 application.properties 的情况下启动应用程序,并在启动后定义 url、用户名和密码(此时我会将所有内容写入 application.properties)。例如,我启动应用程序并从浏览器使用这些参数填充表单。我已经尝试过使用 DataSourceBuilder 类,但它发生得太早了。

DataSourceBuilder
            .create()
            .username(username)
            .password(password)
            .url("jdbc:sqlserver://" + computerName + "\\SQLEXPRESS;DatabaseName=" + dataBaseName)
            .driverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver")
            .build();

我希望能够在应用程序启动后动态更改数据源。

【问题讨论】:

“发生得太早”是什么意思? DataSourceBuilder 可以随时调用,所以一般如果提前调用,就推迟这个调用。 它发生在应用程序启动期间,我需要在应用程序启动后以某种方式调用它。 所以也许你可以创建一些像 DataSourceFactory 这样的组件,使用单一方法来包装对 DataSourceBuilder 的调用?这个 DataSourceFactory 可以注入到其他所有组件中并用于创建数据源。 在我看来,您不能在这种情况下使用默认数据源。您必须使用所需的参数手动定义数据源,并在 JdbcTemplate 或其他任何地方使用相同的参数。您能告诉我您使用的是 JPA 实体还是 JdbcTemplate? 我正在使用这个依赖spring-boot-starter-data-jpa,它包含jdbc starter和jpa。 【参考方案1】:

有多种方法可以解决您的问题。

您可以使用 @PostConstruct 注释: Javax 的 @PostConstruct 注解可用于注解在 bean 初始化后应立即运行一次的方法

也许您的代码可能看起来像这样:

@Component
public class DatabaseService 
    private DataSource dataSource;

    @PostConstruct
    public void init()
        this.dataSource = DataSourceBuilder
        .create()
        .username(username)
        .password(password)
        .url("jdbc:sqlserver://" + computerName + "\\SQLEXPRESS;DatabaseName=" + dataBaseName)
        .driverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver")
        .build();
    

你还需要这个依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

这里有更多方法:tutorial

【讨论】:

我认为你没有完全理解我需要什么。我不需要在启动过程中处理数据源,我需要在应用程序启动并嵌入 tomcat 启动并运行后处理它。如果我使用您的解决方案,我会收到错误:org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration 中的构造函数的参数 0 需要找不到类型为“javax.sql.DataSource”的 bean。 你能告诉我你的代码吗?您尝试使用我的解决方案的班级 我用过你的课,只是用我的值替换了用户名、密码、计算机名和数据库名。 尝试向您添加到我的答案中的应用程序 pom 添加依赖项 我的 pom.xml 中已经有了它。那是相同配置的错误,并且 application.properties 为空。问题是,如果您有该依赖项(我需要),Spring Boot 自动配置正在寻找嵌入式数据库。我正在努力克服这一点,并在应用程序启动并运行后提供一切。我将尝试使用 Spring Cloud Config 或使用嵌入式数据库启动应用程序,然后再切换到 SQL Server 数据库。

以上是关于启动后定义的 Spring Boot DataSource的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot使用——项目启动自动执行sql脚本

MyBatis-Spring-Boot 使用总结

spring boot 启动的图怎么打印的

spring boot启动流程

spring boot 定时备份数据库

spring boot jpa 多数据源配置