Springcut bean () не работает с оператором OR - PullRequest
1 голос
/ 16 марта 2020

Я использую Spring Speci c выражение pointcut, называемое bean (). Для следующего выражения перехватывается только левая часть:

@AfterReturning("bean(FirstService).firstMethod(..) || bean(SecondService).secondMethod(..)")

если я делаю обратное, снова перехватывается левая часть:

@AfterReturning("bean(SecondService).secondMethod(..) || bean(FirstService).firstMethod(..)")

Если я пишу:

@AfterReturning("bean(SecondService).secondMethod(..)")

и @AfterReturning("bean(FirstService).firstMethod(..)") двумя способами

, тогда оба работают. Что не так с первым оператором ИЛИ?

1 Ответ

3 голосов
/ 16 марта 2020

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

Согласно разделу справочной документации Spring 5.4.3. Объявление Pointcut правильным способом объявления указателя pointcut bean() выглядит следующим образом:

bean(idOrNameOfBean)

Маркер idOrNameOfBean может быть именем любого bean-компонента Spring. .

Аспект, подобный следующему коду, является правильным способом определения аспекта, и он будет перехватывать все вызовы методов для обоих компонентов.

@Component
@Aspect
public class BeanAdviceAspect {

    @AfterReturning("bean(firstService) || bean(secondService)")
    public void logMethodCall(JoinPoint jp) {
        System.out.println(jp.getSignature());
    }
}

Выражение точки среза bean(firstService).firstMethod() является неправильным, и среда, похоже, отбрасывает что-либо после bean(firstService), и именно поэтому ваши тестовые сценарии ведут себя по-разному, когда объявление отменяется.

Чтобы подтвердить это поведение, следующий аспект

@Component
@Aspect
public class BeanAdviceAspect {

    @AfterReturning("bean(firstService).firstMethod() || bean(secondService)")
    public void logMethodCall(JoinPoint jp) {
        System.out.println(jp.getSignature());
    }
}

также будет рекомендовать метод firstService.thirdMethod() по причинам, описанным выше.

Другой способ объявить bean Обозначение точки нарезки заключается в следующем. Это соответствует выполнению метода в любых именах bean-компонентов Spring, совпадающих с подстановочным выражением.

@AfterReturning("bean(*Service)")
public void logMethodCall(JoinPoint jp) {
    System.out.println(jp.getSignature());
}

Надеюсь, это поможет

...