获取对 Spring Boot 中当前活动数据源的引用

2022-09-01 15:21:45

我想通过 实现 db data init。DataSourceInitializer

我把它们作为方法放在我的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;
}

更新:此问题旨在获取对正在使用的数据源的引用。这个问题解释了如何以非常简单的方式初始化数据:DataSourceInitializer在Spring boot 1.2上不起作用


答案 1

如果您已经创建了数据源,它将位于spring容器中,因此:

@Autowired
DataSource dataSource;

应该这样做。


答案 2

您说您在应用程序 main 方法下面有这些方法,并且您没有自动连接数据源,因此您正在直接创建一个实例,因此不使用这些属性。您需要使用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;
    }

}

使用 ,即使直接调用该方法,因为 配置类在启动时被子类化,您将获得由 Spring 创建的对象。@ConfigurationCGLIB

有关基于 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;
}

推荐