2012-04-08 7 views
2
public abstract class AService<T> { 
    public T needsToBeAdvised(T param) { 
    T result = doSomething(param); 
    return result; 
    } 
} 

@Service 
public class BService extends AService<B> { 
    @Override 
    public T needsToBeAdvised(T param) { 
    return super.needsToBeAdvised(param); 
    } 
} 

@Service 
public class CService extends AService<C> {} 

// (B & C implement an interface AType) 

@Component 
@Aspect 
public class MyAspect { 
    @Pointcut("execution(* package.AService+.needsToBeAdvised(*))") 
    private void aNeedToBeAdvised() {} 

    @AfterReturning(pointcut="aNeedToBeAdvised()", returning="param") 
    public void interceptNeedsToBeAdvised(JoinPoint joinPoint, AType param) { 
    // some action 
    } 
} 

dieses Setup Gegeben:Frühling AOP - raten Super-Klasse-Methode nicht in Unterklasse überschrieben

bService.needsToBeAdvised(bParam) //is intercepted 

aber

cService.needsToBeAdvised(cParam) //is NOT. 

Wie erreiche ich diese ohne zwingende needsToBeAdvised() in CService?

EDIT:

Ich sollte hinzufügen, dass BService und CService beide sind im gleichen Paket.

Wenn ich mein Punkt-Schnitt wie folgt ändern: Sind alle Dienste im selben Paket

@Pointcut("execution(* package.CService.needsToBeAdvised(*))") 

cService.needsToBeAdvised(cParam) //is still not intercepted 

Der einzige Weg, es funktioniert, wenn ich needsTobeAdvised() in CService

Antwort

1

außer Kraft setzen? Von Ihrem Beispiel-Code vorausgesetzt, vermute ich AService und BService in das package Paket, aber CService in einem anderen Paket zu sein. Werden Leistungen tatsächlich in verschiedenen Paketen sind, haben Sie einige Optionen:

  • verschieben, so dass sie im selben Paket sind
  • Ändern Sie Pointcut mehr generisch zu sein, z.B. "execution(* *.A+.needsToBeAdvised(*))
  • mehr pointcuts
+0

Vielen Dank für Ihre Antwort hinzufügen. Sie sind im selben Paket. Siehe oben Bearbeiten. – mantithetical