AspectJ切入点用于带注释的PRIVATE方法

时间:2013-02-26 16:12:07

标签: spring aop aspectj spring-aop

我想为使用特定注释注释的私有方法创建一个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,则会触发我的方面。我应该如何定义切入点或配置我的方面以使我的原始用例工作?

2 个答案:

答案 0 :(得分:25)

8. Aspect Oriented Programming with Spring

  

由于Spring的AOP框架基于代理的特性,根据定义,受保护的方法既不是针对JDK代理(这不适用),也不针对CGLIB代理(这在技术上可行,但不建议用于AOP)目的)。因此,任何给定的切入点都只能与公共方法匹配!

     

如果您的拦截需要包括受保护/私有方法甚至构造函数,请考虑使用Spring驱动的本机AspectJ编织而不是Spring的基于代理的AOP框架。这构成了具有不同特征的不同AOP使用模式,因此在做出决定之前一定要先熟悉编织。

答案 1 :(得分:1)

切换到AspectJ并使用特权方面。或者更改应用程序的设计,以适应Spring AOP的限制。我的选择将是更强大的AspectJ。