2013-02-26 15 views
5

Ich möchte einen Pointcut für private Methoden erstellen, die mit einer bestimmten Annotation versehen sind. Mein Aspekt wird jedoch nicht ausgelöst, wenn sich die Anmerkung auf einer privaten Methode wie unten befindet.AspectJ pointcut für annotierte PRIVATE-Methoden

@Aspect 
public class ServiceValidatorAspect { 
    @Pointcut("within(@com.example.ValidatorMethod *)") 
    public void methodsAnnotatedWithValidated() { 
} 

@AfterReturning(
      pointcut = "methodsAnnotatedWithValidated()", 
      returning = "result") 
    public void throwExceptionIfErrorExists(JoinPoint joinPoint, Object result) { 
     ... 
} 

Service Interface

public interface UserService { 

    UserDto createUser(UserDto userDto); 
} 

Service Implementation

public class UserServiceImpl implements UserService { 

     public UserDto createUser(UserDto userDto) { 

      validateUser(userDto); 

      userDao.create(userDto); 
     } 

     @ValidatorMethod 
     private validateUser(UserDto userDto) { 

      // code here 
     } 

Allerdings, wenn ich die Anmerkung an eine öffentliche Schnittstelle Methode Implementierung createUser bewegen, wird mein Aspekt ausgelöst. Wie soll ich meinen Pointcut definieren oder meinen Aspekt konfigurieren, damit mein ursprünglicher Anwendungsfall funktioniert?

Antwort

20

8. Aspect Oriented Programming with Spring

Aufgrund der Proxy-basierten Natur des Spring AOP Framework, sind geschützte Methoden definitionsgemäß nicht abgefangen, weder für JDK-Proxies (soweit diese nicht anwendbar ist), noch für CGLIB Proxies (wo dies ist technisch möglich, aber für AOP-Zwecke nicht zu empfehlen). Als Konsequenz wird jeder gegebene Pointcut nur mit öffentlichen Methoden verglichen!

Wenn Ihre Überwachungsanforderungen geschützte/private Methoden oder sogar Konstruktoren einschließen, sollten Sie die Verwendung von Spring-driven nativen AspectJ-Webdiensten anstelle von Spring's proxybasiertem AOP-Framework in Erwägung ziehen. Dies stellt eine andere Art der AOP-Nutzung mit unterschiedlichen Eigenschaften dar, also sollten Sie sich zuerst mit dem Weben vertraut machen, bevor Sie eine Entscheidung treffen.

+0

Gibt es ein Beispiel dafür, auf das Sie zeigen können? Vielen Dank! –

1

Wechseln Sie zu AspectJ und verwenden Sie einen privilegierten Aspekt. Oder ändern Sie das Design Ihrer Anwendung, um den Einschränkungen von Spring AOP gerecht zu werden. Meine Wahl wäre der viel mächtigere AspectJ.