23

Springドキュメントから:

  • プロキシがAccountServiceインターフェースを実装する任意の参加ポイント(Spring AOPでのみメソッド実行):

    this(com.xyz.service.AccountService)
    
  • ターゲットオブジェクトがAccountServiceインターフェースを実装する任意のジョインポイント(Spring AOPでのみメソッド実行):

    target(com.xyz.service.AccountService)
    

target(...)「対象物」とその表現の意味がわかりません。

とどうtarget違うのthis

4

5 に答える 5

27

this(AType)this instanceof ATypeが真であるすべてのジョインポイントを意味します。つまり、これは、あなたの場合、呼び出しがAccountServiceのいずれかのメソッドに到達this instanceof AccountServiceするとtrueになることを意味します。

target(AType)がすべてのジョインポイントを意味しanObject instanceof ATypeます。オブジェクトのメソッドを呼び出していて、そのオブジェクトがAccountServiceのインスタンスである場合、それは有効なジョインポイントになります。

別の方法で要約するとthis(AType)、受信target(AType)者の観点からであり、発信者の観点からです。

于 2012-08-12T21:03:02.453 に答える
12

これは古い投稿ですが、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();
    }

}

簡単に言えば、この側面は2つのことを行っています。

  1. クラスにインターフェースをa.b.c.D実装させる。X
  2. traceable.increment()の各メソッドの前に実行される呼び出しを追加しますa.b.c.D

重要な部分は"execution(* a.b.c.D.*(..)) && this(traceable)"です。ターゲットではなく、これを使用したことに注意してください。

代わりにtargetを使用する場合a.b.c.Dは、導入されたインターフェースではなく、元のクラスと一致させようとしていますX。したがって、SpringAOPはでジョインポイントを検出しませんa.b.c.D

要約すれば:

this-プロキシタイプまたは導入されたタイプをチェックします target-宣言されたタイプをチェックします。

于 2013-10-09T13:00:36.660 に答える
8

公式ドキュメントから:

Spring AOPはプロキシベースのシステムであり、プロキシオブジェクト自体(「this」にバインドされている)とプロキシの背後にあるターゲットオブジェクト(「target」にバインドされている)を区別します。

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

于 2014-09-21T17:44:42.210 に答える
1

このトピックは、AOPプログラミングに関して混乱の原因となることがよくあります。私はウェブ上で違いを要約した非常に良い抜粋の説明を見つけました:

これにより、Bean参照が指定されたタイプのインスタンスであるジョインポイントへのマッチングが制限され、ターゲットオブジェクトが指定されたタイプのインスタンスであるジョインポイントへのマッチングが制限されます。前者はSpringAOPがCGLIBベースのプロキシを作成するときに機能し、後者はJDKベースのプロキシが作成されるときに使用されます。

ターゲットクラスがインターフェイスを実装するとします。

public class FooDao implements BarDao {
    ...
}

この場合、Spring AOPはJDKベースのプロキシを使用します。プロキシされるオブジェクトはProxyクラスのインスタンスであり、BarDaoインターフェイスを実装するため、ターゲットPCDを使用する必要があります。

@Pointcut("target(com.baeldung.pointcutadvice.dao.BarDao)")

一方、FooDaoがインターフェイスを実装していない場合、またはproxyTargetClassプロパティがtrueに設定されている場合、プロキシされるオブジェクトはFooDaoのサブクラスになり、このPCDを使用できます。

@Pointcut("this(com.baeldung.pointcutadvice.dao.FooDao)")

詳細については、次のリンクをご覧ください。

Springのポイントカット式の概要

于 2021-04-01T22:30:57.490 に答える
0

ターゲットとこのポイントカット指定子の素人コードを提供しようとしました。もう手遅れですが、誰かに役立つことを願っています。

アスペクトクラス

package com.opensource.kms;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class SecurityService {

    @Pointcut("target(com.opensource.kms.FooDao)")
    public void myPointCut1() {}

    @Pointcut("this(com.opensource.kms.SooDao)")
    public void myPointCut2() {}

    @Before("myPointCut1()")
    public void beforeMethodTarget() {
        System.out.println("beforeMethodTarget myPointCut1");
    }

    @Before("myPointCut2()")
    public void beforeMethodThis() {
        System.out.println("beforeMethodThis myPointCut2");
    }
}

FooDaoクラス:JDK動的プロキシ

package com.opensource.kms;
import org.springframework.stereotype.Component;

interface BarDao {
    String m();
}

@Component
public class FooDao implements BarDao {

    public String m() {
        System.out.println("implementation of m");
        return "This is return value";
    }
}

SooDaoクラス:CGLIBプロキシ

package com.opensource.kms;
import org.springframework.stereotype.Component;

@Component
public class SooDao {

    public String m() {
        System.out.println("implementation of m : SooDao");
        return "This is return value";
    }
}

メインアプリ

    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(JavaConfig.class);
    SooDao ob1 = ctx.getBean("sooDao", SooDao.class);
    System.out.println("Data using this ->"+ob1.m());
    System.out.println("********************");
    BarDao ob2 = ctx.getBean("fooDao", BarDao.class);
    System.out.println("Data using target -> "+ob2.m());

出力

beforeMethodThis myPointCut2
implementation of m : SooDao
Data using this ->This is return value
********************
beforeMethodTarget myPointCut1
implementation of m
Data using target -> This is return value
于 2020-05-03T09:19:27.897 に答える