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

Java 获取对Spring Boot中当前活动数据源的引用,java,spring,spring-boot,datasource,Java,Spring,Spring Boot,Datasource,我想通过DataSourceInitializer实现db data init 我的Spring Boot main方法下面有这些方法,但它似乎根本没有执行(我试图故意删除字符,只是为了触发一个确认执行的错误。什么都没有发生): 更新:这个问题的目的是获取对正在使用的数据源的引用。这个问题解释了如何以非常简单的方式初始化数据: 如果您已经创建了一个数据源,它将位于spring容器中,因此: @Autowired DataSource dataSource; 应该这样做。您是说您的应用程序主方法

我想通过
DataSourceInitializer
实现db data init

我的Spring Boot main方法下面有这些方法,但它似乎根本没有执行(我试图故意删除字符,只是为了触发一个确认执行的错误。什么都没有发生):

更新:这个问题的目的是获取对正在使用的数据源的引用。这个问题解释了如何以非常简单的方式初始化数据:

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

@Autowired
DataSource dataSource;

应该这样做。

您是说您的应用程序主方法下面有这些方法,并且您没有自动连接数据源,因此您直接创建了一个实例,而没有使用属性。您需要使用Spring创建的singleton对象。为此,您有两种可能:

第一个选项,也是您应该使用的选项,是声明一个配置类来创建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
,甚至直接调用该方法,因为配置类在启动时是用
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;
}

进行了更改,但数据库中仍然没有更改。你知道我的代码还有什么问题吗?Java魔术!谢谢你。在我的例子中,我有多个可能的autowire选项,因此必须指定一个更细粒度的数据源类,如下所示:
@Autowired private-HikariDataSource-datasource如果您有不同的数据源怎么办?@itro您可以自动连接Spring容器中的任何接口或类,如果找到唯一的匹配项,则可以自动连接。请参阅问题末尾的更新。它是这样工作的,但当然,这是非常神奇的,我的目标是学习如何摆脱开机的自动配置。现在,我尝试将
@Autowired
ing
DataSource
作为一个字段,并按照您的建议,将其放置在
@Bean
下面。这两种方法都不起作用。@developer10使用属性初始化bean是否很好?是否正在创建DataSourceInitializer?如果没有,你能展示一下你的主要方法吗?我的主要方法是标准SpringBoot的方法,只是标准线。我不知道如何检查您的要求-我没有看到任何错误表明它不是。然而,我怀疑它根本没有被调用。可能吗?注意:目前我对默认行为没有意见——Spring Boot会拉取并执行我放在资源根目录中的
data.sql
文件(因为这不需要其他任何东西——我只是暂时注释了有问题的方法)。只需在
@Bean
方法中记录一些东西。另外请检查,启动应用程序时,bean未被覆盖。寻找类似于
为bean'dataSourceInitializer'重写bean定义的内容
@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;
}