1

在我的公司,我们正在开发一个面向方面的跟踪拦截器,类似于DebugInterceptor. 我们正在配置 aCustomizableTraceInterceptor并使用 aBeanNameAutoProxyCreator来为 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 Proxy。这个 Resteasy 代理在BConfig.

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

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

4

1 回答 1

1

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

我可能会恢复使用 BeanNameAutoProxyCreator 并依赖于@EnableAspectJAutoProxy使用bean 切入点的方面来附加所需的拦截器。

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

于 2013-08-27T15:05:05.863 回答