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 で動作していません
既に作成されたデータソースがある場合、スプリングコンテナに格納されます。
@Autowired
DataSource dataSource;
それを行う必要があります。
アプリケーションのメインメソッドの下にこれらのメソッドがあり、データソースを自動配線しないため、インスタンスを直接作成しているため、プロパティを使用しないと言っています。 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;
}