2013-02-26 9 views
5

Chcę utworzyć punkt przekroju dla metod prywatnych, które są opatrzone określonym adnotacji. Jednak mój aspekt nie jest wyzwalany, gdy adnotacja jest na prywatnej metody, jak poniżej.AspectJ punktu przekroju dla adnotacjami prywatnych metod

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

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

Interfejs usługi

public interface UserService { 

    UserDto createUser(UserDto userDto); 
} 

Wdrożenie usługi

public class UserServiceImpl implements UserService { 

     public UserDto createUser(UserDto userDto) { 

      validateUser(userDto); 

      userDao.create(userDto); 
     } 

     @ValidatorMethod 
     private validateUser(UserDto userDto) { 

      // code here 
     } 

Jednak jeśli przeniosę adnotacji do sposobu realizacji createUser interfejsu publicznego, mój aspekt jest wyzwalany. Jak zdefiniować swój punkt końcowy lub skonfigurować mój aspekt, aby mój oryginalny przypadek użycia działał?

Odpowiedz

20

8. Aspect Oriented Programming with Spring

Ze względu na charakter proxy oparte ram AOP sprężyny, chronione metody są z definicji nie przechwycone, ani dla prokurentów JDK (jeżeli nie jest to zastosowanie), ani dla prokurentów CGLIB (gdzie to jest technicznie możliwe, ale nie jest zalecane do celów AOP). W konsekwencji, każdy dany punkt będzie dopasowany tylko do publicznych metod!

Jeśli Twoje potrzeby przechwytywania obejmują chroniony/metod prywatnych lub nawet konstruktorzy, rozważyć zastosowanie Wiosna napędzane rodzimej AspectJ tkania zamiast proxy oparte ram AOP sprężyny. Stanowi to inny sposób użycia AOP o różnych charakterystykach, dlatego przed podjęciem decyzji upewnij się, że znasz tkactwo.

+0

Czy istnieje jakiś przykład tego można wskazać? dzięki! –

1

Przełącz na AspectJ i użyj uprzywilejowanego aspektu. Lub zmień projekt swojej aplikacji tak, aby dostosować ograniczenia Spring AOP. Moim wyborem byłby znacznie potężniejszy AspectJ.

Powiązane problemy