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. Проверяет объявленный тип.
Ответ 3
Из официальной документации:
Spring AOP - это система на основе прокси и различает сам прокси-объект (привязанный к 'this') и целевой объект за прокси-сервером (привязанный к "цели" ).
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-pointcuts-designators