【问题标题】:AspectJ : Issue when combining multiple pointcuts in @Around adviceAspectJ:在@Around 建议中组合多个切入点时出现问题
【发布时间】:2012-07-18 13:09:29
【问题描述】:

我是 AspectJ 的初学者,所以请指导我按照以下方法解决发生的问题。

    @Aspect
    public class TestAop {

    @Pointcut("execution(public * com.packg.foo.ClassOne.*(..))")
    public void fooPoint()

    @Pointcut("execution(public * com.packg.cat.ClassTwo.*(..))")
    public void catPoint()

    @Pointcut("execution(public * com.packg.roo.ClassThree.*(..))")
    public void rooPoint()

    @Around("fooPoint() || catPoint() || rooPoint()") 
    public Object myAdvice(ProceedingJoinPoint joinPoint) {
    //do something like joint proceed and all
    }

什么时候不工作? 如果我将所有三个切入点与 OR 结合起来。

什么时候工作? 如果我只保留两个切入点,它就可以工作。

我是否违反了@around 建议的任何规则。是否可以有多个执行/切入点?

期待答案...

【问题讨论】:

    标签: aop aspectj execution pointcuts


    【解决方案1】:

    我有同样的问题,但更好的解决方案是 IMO(对我有用):

    @Aspect
    public class TestAop {
    
    @Pointcut("execution(public * com.packg.foo.ClassOne.*(..)) || execution(public * com.packg.cat.ClassTwo.*(..)) || execution(public * com.packg.roo.ClassThree.*(..))")
    public void fooPoint(){}
    
    @Around("fooPoint()")
    public Object myAdvice(ProceedingJoinPoint joinPoint) {
    //do something like joint proceed and all
    }
    

    【讨论】:

      【解决方案2】:

      我通过为每个切入点创建不同的建议解决了上述问题。 我刚刚找到了一个替代解决方案,但我仍然不相信。

      @Aspect
      public class TestAop {
      
      @Pointcut("execution(public * com.packg.foo.ClassOne.*(..))")
      public void fooPoint()
      
      @Pointcut("execution(public * com.packg.cat.ClassTwo.*(..))")
      public void catPoint()
      
      @Pointcut("execution(public * com.packg.roo.ClassThree.*(..))")
      public void rooPoint()
      
      @Around("fooPoint()") 
      public Object myFooAdvice(ProceedingJoinPoint joinPoint) {
      //do something like joint proceed and all
      }
      
      @Around("catPoint()") 
      public Object myCatAdvice(ProceedingJoinPoint joinPoint) {
      //do something like joint proceed and all
      }
      
      @Around("rooPoint()") 
      public Object myRooAdvice(ProceedingJoinPoint joinPoint) {
      //do something like joint proceed and all
      }
      

      【讨论】:

      • 当一些切入点碰巧重叠时可能会出现问题(在上面的示例中,它们没有重叠,因为它们在不同的包中)。
      猜你喜欢
      • 2023-04-03
      • 1970-01-01
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多