簡體   English   中英

在Spring Boot中獲取對當前活動的dataSource的引用

[英]Get a reference to currently active dataSource in Spring Boot

我想通過DataSourceInitializer實現db data init。

我把這些作為方法就在我的Spring Boot主方法之下,但它似乎根本沒有執行(我試圖故意刪除字符只是為了觸發一個錯誤,這將確認執行。沒有發生任何事情。):

@ConfigurationProperties(prefix="spring.datasource")
@Bean
public DataSource getDataSource() {

    // i was hoping this was going to pull my current datasource, as 
    // defined in application.properties
    return DataSourceBuilder
            .create()
            .build();
}


@Bean
public DataSourceInitializer dataSourceInitializer() {
    ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();
    resourceDatabasePopulator.addScript(new ClassPathResource("/data/init/initData.sql"));

    DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();

    // the call to the above method
    dataSourceInitializer.setDataSource(getDataSource());


    dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator);

    return dataSourceInitializer;
}

更新:此問題旨在獲取對正在使用的dataSource的引用。 這個問題解釋了如何以一種非常簡單的方式初始化數據: DataSourceInitializer不能在Spring boot 1.2上運行

如果您已經創建了數據源,那么它將位於spring容器中,因此:

@Autowired
DataSource dataSource;

應該這樣做。

您說您的應用程序主方法下面有這些方法,並且您沒有自動裝配數據源,因此您要直接創建實例,以便不使用屬性。 您需要使用Spring創建的單例對象。 為了做到這一點,你有兩種可能性:

第一個選項,你應該使用的選項,是聲明一個配置類來創建你的bean:

@Configuration
public class DatasourceConfig
{

    @ConfigurationProperties(prefix="spring.datasource")
    @Bean
    public DataSource getDataSource() {

        // i was hoping this was going to pull my current datasource, as 
        // defined in application.properties
        return DataSourceBuilder
                .create()
                .build();
    }

    @Bean
    public DataSourceInitializer dataSourceInitializer() {
        ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();
        resourceDatabasePopulator.addScript(new ClassPathResource("/data/init/initData.sql"));

        DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();

        // the call to the above method
        dataSourceInitializer.setDataSource(getDataSource());


        dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator);

        return dataSourceInitializer;
    }

}

使用@Configuration ,甚至直接調用該方法,因為Configuration類在啟動時使用CGLIB進行子類化,您將獲得Spring創建的對象。

有關基於Java的配置如何在內部工作的更多信息

第二個選項是在第二種方法中自動連接數據源:

@Bean
@Autowired
public DataSourceInitializer dataSourceInitializer(DataSource myDatasource) {
    ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();
    resourceDatabasePopulator.addScript(new ClassPathResource("/data/init/initData.sql"));

    DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();

    dataSourceInitializer.setDataSource(myDatasource);
    dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator);

    return dataSourceInitializer;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM