Spring ProxyFactoryBean перехват службы не уникален

При перехвате нескольких интерфейсов служб с помощью ProxyFactoryBean и MethodInterceptor перехватчик смешивает интерфейсы служб по некоторым причинам, когда имена методов интерфейса служб совпадают. Мои вопросы:

1.) Существуют ли правила, которые необходимо соблюдать при перехвате нескольких интерфейсов с одним ProxyFactoryBean?

2.) Где код не работает? Я попытался переключить порядок AnotherService и AService в списке "proxyInterfaces", но это тоже не работает.

3.) Я решил проблему, разделив ProxyFactoryBean на две части (см. "Обходной путь" внизу). Это единственное решение или есть способ сохранить ProxyFactoryBean, как описано в разделе "Код"?

Код:

У меня есть несколько служб, которые я перехватываю с помощью ProxyFactoryBean:

<bean name="MyInterceptor" class="com.test.MyInterceptor">

<bean class="org.springframework.aop.framework.ProxyFactoryBean">
  <property name="interceptorNames">
    <list>  
      <value>MyInterceptor</value>
    </list>
  </property>
  <property name="proxyInterfaces">
    <list>
     <value>com.test.AService</value>
     <value>com.test.AnotherService</value>
    </list>
  </property>
</bean>

с классом перехватчика MyInterceptor, реализующим ' invoke ' следующим образом:

public Object invoke(MethodInvocation invocation) throws Throwable {
  Method method = invocation.getMethod();
  String interfaceName = method.getDeclaringClass().getName();
  System.out.println(interfaceName + ": " + method.getName());
}

Сервисные интерфейсы объявлены следующим образом:

public interface AService{
    public void delete();

    public void test();
}

public interface AnotherService{
    public void delete();
}

Теперь, когда я автоматически соединяю AService с классом, я ожидаю, что смогу использовать функцию удаления и тестирования AService:

public class Test{

  @Autowired
  private AService aService;

  public void testAservice(){
    aService.test();
    aService.delete();
  }

}

В моем перехватчике вызов aService.test() приходит без проблем. Однако вызов aService.delete() каким-то образом вызывает интерфейс AnotherService. Консольный вывод от перехватчика выглядит следующим образом:

com.test.AService: test
com.test.AnotherService: delete 

Обходной путь : я разделил ProxyFactoryBean на два с двумя отдельными bean- объектами- перехватчиками (оба ссылаются на один и тот же класс, как и раньше):

<bean name="MyInterceptor1" class="com.test.MyInterceptor"/>
<bean class="org.springframework.aop.framework.ProxyFactoryBean">
  <property name="interceptorNames">
    <list>  
      <value>MyInterceptor1</value>
    </list>
  </property>
  <property name="proxyInterfaces">
    <list>
     <value>com.test.AService</value>
    </list>
  </property>
</bean>

<bean name="MyInterceptor2" class="com.test.MyInterceptor"/>
<bean class="org.springframework.aop.framework.ProxyFactoryBean">
  <property name="interceptorNames">
    <list>  
      <value>MyInterceptor2</value>
    </list>
  </property>
  <property name="proxyInterfaces">
    <list>
     <value>com.test.AnotherService</value>
    </list>
  </property>
</bean>

Теперь эта конфигурация дает ожидаемый результат:

com.test.AService: test
com.test.AService: delete

1 ответ

Решение

Прокси - это просто реализация перечисленных вами интерфейсов, но в Java просто невозможно реализовать один и тот же метод из нескольких интерфейсов без коллизий.

Пожалуйста, посмотрите эту ветку для примера.

Так что просто оставайтесь со своим решением или измените имена методов удаления, чтобы они были другими (лучше вариант).

Другие вопросы по тегам