BeanNameAutoProxyCreator与导入配置之间的隐式依赖关系

在我的公司,我们正在开发一个面向方面的跟踪拦截器,类似于 DebugInterceptor . 我们正在配置 CustomizableTraceInterceptor 并使用 BeanNameAutoProxyCreator 为AOP自动代理bean .

我们面临的问题是,当我们在配置中引入 BeanNameAutoProxyCreator 时:

@Configuration
@Import(BConfig.class)
@EnableAspectJAutoProxy
public class AConfig {
    @Bean
    public static BeanNameAutoProxyCreator beanNameAutoProxyCreator() {
        BeanNameAutoProxyCreator beanNameAutoProxyCreator = new BeanNameAutoProxyCreator();
        beanNameAutoProxyCreator.setInterceptorNames(new String[] {DEBUG_INTERCEPTOR_NAME});
        beanNameAutoProxyCreator.setBeanNames(new String[] {BEANS_NAMES_EXPRESSION});
        return beanNameAutoProxyCreator;
    }
}

我们得到一个org.springframework.beans.factory.NoSuchBeanDefinitionException:没有类型[X]的限定bean,其中X是Resteasy Proxy . 此Resteasy代理在 BConfig 中声明 .

现在,如果我将Resteasy Proxy bean配置移动到AConfig,这个问题就解决了, @DependsOn 也解决了这个问题 .

我的问题是3:什么时候Spring能够解决bean之间的依赖关系?为什么使用BeanNameAutoProxyCreator会更改此行为?解决此问题的推荐方法是什么(BeanPostProcessor,@ DependsOn等) .

回答(1)

2 years ago

静态 BeanNameAutoProxyCreator 依赖于普通bean(可能是由于BEANS_NAMES_EXPRESSION) . 因为它是静态的,所以在任何其他bean之前加载/引导,特别是在bean处理 @Import 之前 . 所以基本上在分析要处理的bean时, BConfig 尚未加载 . 这就是为什么当你将bean移动到 AConfig 或者这个bean的依赖时它会起作用的原因 .

我可能会恢复使用BeanNameAutoProxyCreator并依赖 @EnableAspectJAutoProxy 和一个方面使用bean pointcut来附加所需的拦截器 .

由于2种不同的AOP策略/机制,在 @EnableAspectJAutoProxy 旁边引入 BeanNameAutoProxyCreator 还有另一种风险,它可能导致代理被创建 .