2013-08-23 5 views
1

В моей компании мы работаем над аспектно-ориентированным перехватчиком трассировки, аналогичным DebugInterceptor. Мы настраиваем CustomizableTraceInterceptor и используем BeanNameAutoProxyCreator для автопрокси-бонов для АОП.Неявная зависимость между 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 - прокси-сервер. Этот прокси-сервер Restaasy объявлен в BConfig.

Теперь, если я перейду на конфигурацию прокси-сервера Resteasy Proxy до AConfig, эта проблема будет решена, и @DependsOn решает проблему.

Мои вопросы: 3: когда Spring способен разрешать зависимости между фасолью? Почему использование BeanNameAutoProxyCreator меняет это поведение? Каков рекомендуемый способ решения этой проблемы (BeanPostProcessor, @DependsOn и т. Д.).

ответ

1

Статический BeanNameAutoProxyCreator зависит от обычного компонента (возможно, из-за BEANS_NAMES_EXPRESSION). Поскольку он является статическим, он загружается/загружается перед любыми другими компонентами и особенно перед обработкой компонента @Import. Поэтому в основном при анализе, какие компоненты обрабатываются, BConfig еще не загружен. Вот почему он работает, когда вы перемещаете компонент в AConfig или в зависимости от этого компонента.

Я бы, вероятно, отказался от использования BeanNameAutoProxyCreator и полагался на @EnableAspectJAutoProxy вместе с аспектом, используя bean pointcut, чтобы прикрепить желаемый перехватчик.

Существует еще один риск при введении BeanNameAutoProxyCreator рядом с @EnableAspectJAutoProxy, что может привести к созданию прокси-сервера создаваемого прокси из-за двух различных стратегий/механизмов АОП.

Смежные вопросы