在 Spring Boot 中获取对当前活动数据源的引用
Get a reference to currently active dataSource in Spring Boot
我想通过 DataSourceInitializer
实现数据库数据初始化。
我在 Spring Boot main 方法下面有这些方法,但它似乎根本没有执行(我尝试故意删除字符只是为了触发一个错误,这将确认处决。什么都没发生。):
@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;
}
更新:这个问题旨在获取对正在使用的数据源的引用。这个问题解释了如何以一种非常简单的方式初始化数据:
如果您已经创建了数据源,它将位于 spring 容器中,因此:
@Autowired
DataSource dataSource;
应该做。
您是说您在应用程序主方法下面有这些方法,并且您没有自动装配数据源,所以您是直接创建实例而不使用属性。您需要使用 Spring 创建的单例对象。为此,您有两种可能性:
第一个选项,也是您应该使用的选项,是声明一个配置 class 来创建您的 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
,甚至直接调用该方法,因为配置 classes 在启动时被 class 子 CGLIB
编辑,您正在获取对象由 Spring.
创建
Further information about how Java-based configuration works internally
第二个选项是在第二种方法中自动连接数据源:
@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;
}
我想通过 DataSourceInitializer
实现数据库数据初始化。
我在 Spring Boot main 方法下面有这些方法,但它似乎根本没有执行(我尝试故意删除字符只是为了触发一个错误,这将确认处决。什么都没发生。):
@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;
}
更新:这个问题旨在获取对正在使用的数据源的引用。这个问题解释了如何以一种非常简单的方式初始化数据:
如果您已经创建了数据源,它将位于 spring 容器中,因此:
@Autowired
DataSource dataSource;
应该做。
您是说您在应用程序主方法下面有这些方法,并且您没有自动装配数据源,所以您是直接创建实例而不使用属性。您需要使用 Spring 创建的单例对象。为此,您有两种可能性:
第一个选项,也是您应该使用的选项,是声明一个配置 class 来创建您的 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
,甚至直接调用该方法,因为配置 classes 在启动时被 class 子 CGLIB
编辑,您正在获取对象由 Spring.
Further information about how Java-based configuration works internally
第二个选项是在第二种方法中自动连接数据源:
@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;
}