Spring AOP target() vs this()

Из Spring Документация:

  • любая точка соединения (выполнение метода только в Spring AOP), где прокси-сервер реализует интерфейс AccountService:

    this(com.xyz.service.AccountService)
    
  • любая точка соединения (выполнение метода только в Spring АОП), где целевой объект реализует интерфейс AccountService:

    target(com.xyz.service.AccountService)
    

Я не понимаю, что означает "целевой объект" и выражение target(...).

Как target отличается от this?

Ответ 1

this(AType) означает все точки соединения, где this instanceof AType истинно. Таким образом, это означает, что в вашем случае, когда вызов достигнет любого метода AccountService this instanceof AccountService, будет истинным.

target(AType) означает все точки соединения, где anObject instanceof AType. Если вы вызываете метод для объекта, и этот объект является экземпляром AccountService, это будет действительная точка соединения.

Подводя итог другому способу - this(AType) с точки зрения получателей, а target(AType) - с точки зрения вызывающих абонентов.

Ответ 2

Я знаю, что это старый пост, но я просто наткнулся на важное различие между этой и целевой, не используя AspectJ.

Рассмотрим следующий аспект введения:

@Aspect
public class IntroductionsAspect {

    @DeclareParents(value="a.b.c.D", defaultImpl=XImpl.class)
    public static X x;

    @After("execution(* a.b.c.D.*(..)) && this(traceable)")
    public void x(Traceable traceable) {
        traceable.increment();
    }

}

Проще говоря, этот аспект делает две вещи:

  • Создание класса a.b.c.D реализует интерфейс X.
  • Добавление вызова к traceable.increment() для выполнения перед каждым методом a.b.c.D.

Важная часть "execution(* a.b.c.D.*(..)) && this(traceable)". Обратите внимание, что я использовал этот, а не target.

Если вы используете target, вы пытаетесь сопоставить оригинальный класс a.b.c.D, а не введенный интерфейс X. Таким образом, Spring AOP не найдет точки соединения в a.b.c.D.

Вкратце:

this. Проверяет тип прокси или введенный тип. target. Проверяет объявленный тип.