AspectJ切入点的注解私有方法(AspectJ pointcut for annotated P

2019-07-20 14:22发布

我想创建一个被标注了具体的注解私有方法的切入点。 然而,当注释是像下面的私有方法我的方面不会被触发。

@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 ,我的方面被触发。 我应该如何定义我的切入点或者配置我的方面,让我原来使用的情况下工作?

Answer 1:

8.面向方面编程使用Spring

由于Spring的AOP框架的基于代理的性质,保护的方法是通过定义不拦截,既不是JDK代理(其中,这是不适用),也不是CGLIB代理(其中这在技术上是可行的,但不推荐用于AOP目的)。 因此,任何给定的切入点将只针对公共方法相匹配!

如果您的拦截需求包括保护/私有方法,甚至构造,考虑使用Spring驱动的本地AspectJ织,而不是Spring基于代理的AOP框架。 这构成了AOP使用具有不同特性的不同的模式,所以一定要让自己熟悉编织第一后再做决定。



Answer 2:

切换到AspectJ和使用特权方面。 或更改应用程序的设计,以适应春季AOP的局限性。 我的选择将是更加强大的AspectJ。



文章来源: AspectJ pointcut for annotated PRIVATE methods