Причина, по которой это выражение сокращения точек не работает должным образом, заключается в том, что оно неверно. Платформа 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());
}
Надеюсь, это поможет