Spring AOP target()vs this()

rap*_*apt 16 spring spring-aop

Spring文档:

我不明白什么是"目标对象"和表达方式target(...).

有什么target不同this

Bij*_*men 24

this(AType)表示所有连接点都this instanceof AType为真.所以这意味着在你的情况下,一旦调用到达AccountService的任何方法都this instanceof AccountService将是真的.

target(AType)表示所有连接点在哪里anObject instanceof AType.如果要在对象上调用方法,并且该对象是AccountService的实例,那么它将是有效的连接点.

总结一种不同的方式 - this(AType)从接收者的角度来看,并且target(AType)来自呼叫者的角度.

  • 这在 AspectJ 中很重要,但在 Spring AOP 中你是对的,因为“call”(通常与目标一起使用)将编织调用者,而“execution”(连同它)将编织类本身。这很重要,因为对于编译时编织之类的东西,您可能无法访问第三方类来使用执行进行编织,然后您可以将调用编织到第三方库。 (2认同)

Aki*_*ira 11

我知道这是一个老帖子,但我发现这个和目标之间的重要区别,而不使用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();
    }

}
Run Code Online (Sandbox Code Playgroud)

简而言之,这方面做了两件事:

  1. 使a.b.c.D类实现X接口.
  2. traceable.increment()在每个方法之前添加要执行的调用a.b.c.D.

重要的是"execution(* a.b.c.D.*(..)) && this(traceable)".请注意,我使用了这个,而不是目标.

如果您使用目标,则尝试匹配原始类a.b.c.D,而不是引入的接口X.所以Spring AOP将找不到任何连接点a.b.c.D.

综上所述:

this - 检查代理类型或引入的类型. target - 检查声明的类型.


hoo*_*man 6

从官方文件:

Spring AOP是一个基于代理的系统,它区分代理对象本身(绑定到'this')和代理后面的目标对象(绑定到'target').

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-pointcuts-designators