【问题标题】:Extending DataSource with a sub class in Spring Boot AutoConfiguration在 Spring Boot AutoConfiguration 中使用子类扩展 DataSource
【发布时间】:2021-04-25 15:23:11
【问题描述】:

我正在尝试编写一个自动配置库,为任何DataSource 添加功能。我编写了一个子类,我将在这里调用CustomDataSource,它覆盖了DataSource 的一些方法。

@Configuration
@ConditionalOnBean(DataSource.class)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class CustomDataSourceAutoConfiguration {

    private final DataSource dataSource;

    public CustomDataSourceAutoConfiguration(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Primary
    @Bean
    public CustomDataSource customDataSource() {
        return new CustomDataSource(dataSource);
    }
}

但我找不到让我做我想做的事的方法。它总是会导致循环引用和异常:

BeanCurrentlyInCreationException: Error creating bean with name 'customDataSource': Requested bean is currently in creation: Is there an unresolvable circular reference?

有没有办法解决这个问题?

【问题讨论】:

  • 嗯,很奇怪。如果您使用dataSource 的字段注入代替(@Autowired private DataSource dataSource),它是否有效?
  • 不,不幸的是,这会导致完全相同的错误。

标签: java spring spring-boot jdbc


【解决方案1】:

我找到了解决此问题的方法,方法是实现 BeanPostProcessor

public class DataSourcePostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) {
        if (bean instanceof DataSource && !(bean instanceof CustomDataSource)) {
            return new CustomDataSource((DataSource) bean);
        } else {
            return bean;
        }
    }

}

postProcessAfterInitialization 方法可以显式用于在代理中包装 bean,引用自 BeanPostProcessor documentation

[...] 使用代理包装 bean 的后处理器通常会实现 postProcessAfterInitialization(java.lang.Object, java.lang.String)

【讨论】:

    猜你喜欢
    • 2016-11-23
    • 2014-12-29
    • 2021-07-30
    • 2015-06-13
    • 2019-06-10
    • 1970-01-01
    • 2020-09-24
    • 2020-02-17
    • 1970-01-01
    相关资源
    最近更新 更多