2016-05-20 5 views
0

Ich habe zwei öffentliche Methoden in der gleichen Klasse mit dem gleichen Rückgabetyp, nur das Argument ist unterschiedlich. Ich möchte einen Pointcut nur auf einen davon anwenden lassen. HierSpring AOP Pointcut differenziert durch Argumente

ist das Beispiel der Klasse:

public class HahaService{ 

    public MyObject sayHaha(User user){ 
     //do something 
    } 

    public MyObject sayHaha(Long id, User user){ 
     //do something 
    } 
} 

Jetzt möchte ich ein pointcut haben nur auf der 2. sayHaha Methode anzuwenden, die zwei Argumente nimmt: eine Long id und einem User Benutzer.

Ich habe derzeit ein @Pointcut

@Pointcut("execution(public MyObject com.abc.service.HahaService.sayHaha(..))") 
private void hahaPointCut() { 
} 

Diese pointcut sowohl sayHaha Methode angewendet wird.

Gibt es einen Weg, ich kann es nur auf dem zweiten tun?

Antwort

2

Ja, beschränken Sie Ihren Pointcut-Ausdruck nur auf Methoden mit bestimmten Parametertypen.

Sie sich von der .. befreien und die Parametertypen

@Pointcut("execution(public MyObject com.example.HahaService.sayHaha(Long, com.example.User))") 

Alternativ angeben, wenn Sie tatsächlich den Wert der Argumente benötigen, können Sie Namen, um sie einzufangen verbindlich. Zum Beispiel Ihre pointcut als

@Pointcut("execution(public MyObject com.example.HahaService.sayHaha(..)) && args(id, user)") 
private void hahaPointCut(Long id, User user) { 
} 

und dem Rat erklärt werden würde, zum Beispiel ein @Before, würde als (Wiederholung der Namen) deklariert werden

@Before("hahaPointCut(id, user) ") 
public void before(Long id, User user) { 
    /* execute advice */ 
} 

Jetzt Frühling AOP die Typen von der bestimmen kann, Parameter durch die Übereinstimmung zwischen den Parametern im Punktschnitt und den in args verwendeten Namen. Es stimmt dann mit denen in @Before überein und bindet an entsprechende Aufrufargumente.

Diese Technik wird im Kapitel Passing parameters to advice beschrieben.

+0

Dank Sotirios – jasonfungsing

Verwandte Themen