【问题标题】:Implicit dependency between BeanNameAutoProxyCreator and imported configurationBeanNameAutoProxyCreator 和导入配置之间的隐式依赖关系
【发布时间】:2025-12-14 14:55:02
【问题描述】:

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

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

@配置 @Import(BConfig.class) @EnableAspectJAutoProxy 公共类 AConfig { @豆 公共静态 BeanNameAutoProxyCreator beanNameAutoProxyCreator() { BeanNameAutoProxyCreator beanNameAutoProxyCreator = new BeanNameAutoProxyCreator(); beanNameAutoProxyCreator.setInterceptorNames(new String[] {DEBUG_INTERCEPTOR_NAME}); beanNameAutoProxyCreator.setBeanNames(new String[] {BEANS_NAMES_EXPRESSION}); 返回 beanNameAutoProxyCreator; } }

我们得到一个 org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [X],其中 X 是一个 Resteasy 代理。这个 Resteasy 代理在 BConfig 中声明。

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

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

【问题讨论】:

    标签: spring spring-aop


    【解决方案1】:

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

    我可能会恢复使用 BeanNameAutoProxyCreator 并依赖 @EnableAspectJAutoProxy 以及使用 bean pointcut 的方面来附加所需的拦截器。

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

    【讨论】: