如何从另一个数据源引用默认数据源?

问题描述 投票:0回答:1

我正在编写一个包装 DataSource 的 bean,以向其添加一些内部功能。看来 MyDataSource 正在尝试在构造函数中使用自身。我的新班级如下所示:

@Component
public class MyDataSource implements DataSource {

  public MyDataSource(DataSource wrapped) {
    // do something...
  }

}

当我尝试运行该应用程序时,我得到:

创建名为“myDataSource”的 bean 时出错:当前正在创建请求的 bean:是否存在无法解析的循环引用?

我根本不控制普通数据源的创建,因此它没有

Qualifier
@Primary
。我确实控制 MyDataSource。

如何告诉我的 bean 在实例化期间应该使用“另一个数据源”,而不是它本身?

java spring spring-boot datasource instantiation
1个回答
0
投票

当您的自定义 bean 和原始 bean 具有相同的接口类型(如您的情况中的

DataSource
)时,这种情况很常见。要解决这个问题,您需要指导 Spring 将哪个 bean 注入到哪里,确保您的
MyDataSource
不会尝试自行包装,从而导致循环引用。

有多种策略可以解决此问题,但一种常见的方法是使用

@Qualifier
注释或使用特定方法并使用
@Primary
定义您的 bean。但是,正如您提到的,您无法控制原始
DataSource
的创建,并且它没有
@Qualifier
@Primary
,我们需要找到另一种方法。

针对您的情况,一种实用的方法是定义一个 @Configuration 类,该类显式配置您的自定义 DataSource 并使用它来包装现有的 DataSource bean。

  • @Component
    中删除
    MyDataSource
    。这可以防止 Spring 尝试自动实例化它。
  • 创建配置类。在本课程中,您将手动配置
    MyDataSource
    并注入现有的
    DataSource
@Configuration
public class DataSourceConfig {

    @Bean
    public MyDataSource myDataSource(DataSource dataSource) {
        // Ensure that the dataSource bean injected here is the original DataSource
        // and not your MyDataSource. Spring should handle this automatically
        // since MyDataSource is now being created manually in this configuration.
        return new MyDataSource(dataSource);
    }
}

此配置显式声明您的

MyDataSource
应包装 Spring 自动配置的
DataSource
bean。由于
MyDataSource
不再用
@Component
注解,Spring 不会尝试自动实例化它,从而避免了循环引用。

© www.soinside.com 2019 - 2024. All rights reserved.