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



我想为带有特定注释的私有方法创建一个切入点。但是,当注释位于私有方法上时,我的方面不会触发,如下所示。

@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,则会触发我的方面。我应该如何定义切入点或配置方面以使原始用例正常工作?

8。使用Spring进行面向方面编程

由于Spring的AOP框架基于代理的特性,受保护的方法根据定义是不会被拦截的,无论是对于JDK代理(这是不适用的)还是对于CGLIB代理(这在技术上是可能的,但不推荐用于AOP目的)。因此,任何给定的切入点都只能与公共方法匹配!

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

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

相关内容

  • 没有找到相关文章

最新更新