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.