web-dev-qa-db-ja.com

Spring Bootで現在アクティブなdataSourceへの参照を取得します

DataSourceInitializerを介してdbデータ初期化を実装したい。

私はこれらを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ブート1.2 で動作していません

10
developer10

既に作成されたデータソースがある場合、スプリングコンテナに格納されます。

@Autowired
DataSource dataSource;

それを行う必要があります。

20
Essex Boy

アプリケーションのメインメソッドの下にこれらのメソッドがあり、データソースを自動配線しないため、インスタンスを直接作成しているため、プロパティを使用しないと言っています。 Springによって作成されたシングルトンオブジェクトを使用する必要があります。そのためには、次の2つの可能性があります。

最初のオプション、および使用すべきオプションは、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ベースの構成が内部でどのように機能するかに関する詳細情報

2番目のオプションは、2番目の方法でデータソースを自動接続します。

@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;
}
0
alfcope