当前位置: 首页 > 知识库问答 >
问题:

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

百里阳平
2023-03-14

我想通过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;
}

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

共有2个答案

贡英华
2023-03-14

您的意思是,您的应用程序主方法下面有这些方法,并且您没有自动连接数据源,因此您直接创建了一个实例,因此没有使用属性。您需要使用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创建的对象。

关于基于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;
}
商飞龙
2023-03-14

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

@Autowired
DataSource dataSource;

我应该这么做。

 类似资料:
  • 问题内容: 情况如下: 在线程中触发事件。 需要检索当前活动。 然后在该活动上创建一个对话框并显示。 问题:据我搜索,还没有办法在前台检索当前活动。 额外信息:这需要能够在多个活动中进行处理。因此,它可以在活动A或B或C中弹出。 问题答案: 我不确定这是否是您要寻找的东西,但这似乎很简单。http://iamvijayakumar.blogspot.com/2011/09/get- current

  • 它可能得到当前的活动选项卡在火狐使用硒?我创建的应用程序是半自动的(用户正在打开标签,如果他想转储其中一个,他只是点击热键)。 但我有问题,当用户打开多个标签,我需要知道哪一个我应该切换到转储网站。

  • 我有一个猫头鹰旋转木马,每张幻灯片有一个项目,画廊中的每个图像都有不同的尺寸和纵横比。 我想要的是获得当前或活动图像的宽度和高度。 我试过: 但是,这将返回图像以前的维度,而不是它所更改的图像。

  • 我的应用程序中有一个带有待定意图集的通知。当我使用我的应用程序时,我会进行几个活动。登录- 我想带回用户将其带回时位于顶部的活动。换句话说,我想模拟行为- 有办法做到这一点吗? 谢谢

  • 问题内容: 参考先前提出的问题,我想知道如何获取当前活动文档的标题。 我尝试了上述问题的答案中提到的脚本。这有效,但仅给我应用程序的名称。例如,我正在写这个问题:启动脚本时,它将为我提供应用程序的名称,即“ Firefox”。这很干净,但并没有真正的帮助。我想记录我当前活动文档的标题。看到图像。 Firefox标题http://img.skitch.com/20090126-nq2egknhjr9

  • 我想在带有toast的活动上显示viewpager2中的所选项目描述。 如何从viewpager获取数据? 我可以显示项目位置,但我想用toast显示所选项目描述。 对不起,我的英语不好。 谢谢你的帮助。 我的代码如下所示; array\u str\u值: 我的适配器: PagerM: