2013-08-23 31 views
1

在我的公司,我们正在研究面向方面的跟踪拦截器,类似于DebugInterceptor。我们正在配置一个CustomizableTraceInterceptor并使用BeanNameAutoProxyCreator为AOP自动代理bean。BeanNameAutoProxyCreator和导入配置之间的隐式依赖关系

我们面临的问题是,当我们在配置介绍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] ,其中X是Resteasy代理。此Resteasy代理在BConfig中声明。

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

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

回答

1

静态BeanNameAutoProxyCreator依赖于正常的bean(可能是由于BEANS_NAMES_EXPRESSION)。因为它是静态的,所以在任何其他bean之前加载/ bootstrapped,特别是在豆处理之前@Import。所以基本上在分析要处理的豆时,BConfig尚未加载。这就是为什么当你将bean移动到AConfig或者依赖于这个bean的时候它是有效的。

我可能会恢复使用BeanNameAutoProxyCreator,并依靠@EnableAspectJAutoProxy连同使用bean pointcut附加所需拦截器的方面。

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