Java 启动后定义的Spring启动数据源

Java 启动后定义的Spring启动数据源,java,spring,spring-boot,datasource,Java,Spring,Spring Boot,Datasource,我有一个使用SQL Server的Spring启动应用程序。我希望能够在没有application.properties的情况下启动应用程序,并在启动后定义url、用户名和密码(此时我将把所有内容写入application.properties)。例如,我启动应用程序并从浏览器用这些参数填充表单。我试过使用DataSourceBuilder类,但现在还为时过早 DataSourceBuilder .create() .username(userna

我有一个使用SQL Server的Spring启动应用程序。我希望能够在没有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();

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

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

您可以使用@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>

org.springframework.boot

什么叫“事情发生得太早”?DataSourceBuilder可以在任何时候调用,所以一般来说,如果它被提前调用,只需推迟此调用。它发生在应用程序启动期间,我需要在应用程序启动后以某种方式调用它。所以,您可以创建一些组件,如DataSourceFactory,使用单个方法包装对DataSourceBuilder的调用?此DataSourceFactory可以注入其他所有组件并用于创建数据源。在我看来,在这种情况下,您不能使用默认数据源。您必须使用所需的参数手动定义数据源,并在JdbcTemplate或其他任何地方使用相同的参数。您能告诉我您使用的是JPA实体还是JdbcTemplate吗?我使用的是spring boot starter数据JPA,它包含jdbc starter和JPA。我想您没有完全理解我需要什么。我不需要在启动期间处理数据源,我需要在应用程序启动并嵌入tomcat并运行之后处理它。如果我使用你的解决方案,我会得到错误:org.springframework.boot.autoconfigure.orm.jpa.hibernatejpa中构造函数的参数0。自动配置需要一个类型为“javax.sql.DataSource”的bean,但找不到。你能给我看看你的代码吗?您尝试使用我的解决方案的类我使用了您的类,只是用我的值替换了用户名、密码、computerName和dataBaseName。尝试向您的应用程序pom添加依赖项,我已将其添加到我的回答中我的pom中。这是相同配置的错误,并且application.properties为空。问题是SpringBootAuto配置正在寻找嵌入式数据库,若你们有那个种依赖关系(我需要)。我试图克服这一点,并在应用程序启动和运行后提供一切。我将尝试使用SpringCloudConfig或使用嵌入式数据库启动应用程序,然后再切换到SQLServer数据库。