在spring引导自动配置中用子类扩展java数据源

m0rkklqb  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(193)

我正在尝试编写一个自动配置库,为任何 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?

有办法吗?

cvxl0en2

cvxl0en21#

我通过实现 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 方法可以显式地用于在代理中 Package bean,引用 BeanPostProcessor 文档:
[…]用代理封装bean的后处理器通常会实现 postProcessAfterInitialization(java.lang.Object, java.lang.String) .

相关问题