2013-02-26 11 views
5

Desidero creare un Punto di collegamento per metodi privati ​​annotati con un'annotazione specifica. Tuttavia, il mio aspetto non viene attivato quando l'annotazione si trova su un metodo privato come di seguito.Punto di vista AspectJ per metodi PRIVATE annotati

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

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

Interface Servizio

public interface UserService { 

    UserDto createUser(UserDto userDto); 
} 

Servizio Attuazione

public class UserServiceImpl implements UserService { 

     public UserDto createUser(UserDto userDto) { 

      validateUser(userDto); 

      userDao.create(userDto); 
     } 

     @ValidatorMethod 
     private validateUser(UserDto userDto) { 

      // code here 
     } 

Tuttavia, se mi sposto l'annotazione a un metodo di implementazione di interfaccia pubblica createUser, il mio aspetto è innescato. Come dovrei definire il mio pointcut o configurare il mio aspetto per far funzionare il mio caso d'uso originale?

risposta

20

8. Aspect Oriented Programming with Spring

A causa della natura delega basata su framework AOP di primavera, metodi protetti sono, per definizione, non intercettato, né per i proxy JDK (in cui ciò non è applicabile), né per i proxy CGLIB (dove questo è tecnicamente possibile ma non è raccomandabile per gli scopi AOP). Di conseguenza, qualsiasi dato pointcut verrà confrontato solo con i metodi pubblici!

Se le esigenze di intercettazione includono metodi protetti/privati ​​o anche costruttori, prendere in considerazione l'uso della tessitura nativa di AspectJ basata su Spring invece del framework AOP basato su proxy di Spring. Ciò costituisce una modalità diversa di utilizzo di AOP con caratteristiche diverse, quindi assicurati di familiarizzare con la tessitura prima di prendere una decisione.

+0

C'è qualche esempio a cui puoi puntare? Grazie! –

1

Passare a AspectJ e utilizzare un aspetto privilegiato. Oppure cambia il design della tua applicazione in modo da soddisfare i limiti di Spring AOP. La mia scelta sarebbe l'AspectJ molto più potente.

Problemi correlati