在我的公司,我们正在开发一个面向方面的跟踪拦截器,类似于 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 回答
静态
BeanNameAutoProxyCreator
依赖于普通bean(可能是由于BEANS_NAMES_EXPRESSION) . 因为它是静态的,所以在任何其他bean之前加载/引导,特别是在bean处理@Import
之前 . 所以基本上在分析要处理的bean时,BConfig
尚未加载 . 这就是为什么当你将bean移动到AConfig
或者这个bean的依赖时它会起作用的原因 .我可能会恢复使用BeanNameAutoProxyCreator并依赖
@EnableAspectJAutoProxy
和一个方面使用bean pointcut来附加所需的拦截器 .由于2种不同的AOP策略/机制,在
@EnableAspectJAutoProxy
旁边引入BeanNameAutoProxyCreator
还有另一种风险,它可能导致代理被创建 .