![](/img/trans.png)
[英]Spring Boot + Quartz: "Requested bean is currently in creation: Is there an unresolvable circular reference?"
[英]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創建的對象。
第二個選項是在第二種方法中自動連接數據源:
@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.