AspectJ pointcut для аннотированных ЧАСТНЫХ методов

Я хочу создать Pointcut для частных методов, аннотированных определенной аннотацией. Однако мой аспект не срабатывает, когда аннотация находится на частном методе, как показано ниже.

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

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

Сервисный интерфейс

public interface UserService {

    UserDto createUser(UserDto userDto);
}

Внедрение сервиса

    public class UserServiceImpl implements UserService {

       public UserDto createUser(UserDto userDto) {

             validateUser(userDto);

             userDao.create(userDto);
       }

       @ValidatorMethod
       private validateUser(UserDto userDto) {

            // code here
       }

Однако, если я переместить аннотацию к реализации метода открытого интерфейса createUserМой аспект срабатывает. Как мне определить мой pointcut или настроить мой аспект, чтобы заставить работать мой исходный вариант использования?

2 ответа

Решение

8. Аспектно-ориентированное программирование с помощью Spring

Из-за основанной на прокси природе инфраструктуры AOP Spring защищенные методы по определению не перехватываются ни для прокси-серверов JDK (если это не применимо), ни для прокси-серверов CGLIB (где это технически возможно, но не рекомендуется для целей AOP). Как следствие, любой данный pointcut будет сопоставляться только с публичными методами!

Если ваши потребности в перехвате включают защищенные / приватные методы или даже конструкторы, рассмотрите возможность использования собственного AspectJ-ткачества, основанного на Spring, вместо среды AOP на основе прокси Spring. Это представляет собой другой режим использования АОП с другими характеристиками, поэтому обязательно ознакомьтесь с ткачеством, прежде чем принимать решение.

Переключитесь на AspectJ и используйте привилегированный аспект. Или измените дизайн своего приложения, чтобы учесть ограничения Spring AOP. Мой выбор был бы гораздо более мощным AspectJ.

Другие вопросы по тегам