有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Spring Boot自动配置中使用子类扩展java数据源

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

有办法解决这个问题吗


共 (1) 个答案

  1. # 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,引用^{} documentation

    [...] post-processors that wrap beans with proxies will normally implement postProcessAfterInitialization(java.lang.Object, java.lang.String).