【问题标题】:AspectJ pointcut && is behaving like ||AspectJ 切入点 && 的行为类似于 ||
【发布时间】:2023-04-08 10:45:01
【问题描述】:

我有以下建议:

@Before("execution(* com.myapp..*.*(..)) && !execution(* com.myapp.cms.workflow..*.*(..))")
public void logBefore(JoinPoint joinPoint) {
    log.info("Calling " + joinPoint.getSignature().getName());
}

当我将第二个条件添加到切入点时:

&& !execution(* com.myapp.cms.workflow..*.*(..))

它记录来自每个包的每个方法调用。

我希望该建议仅适用于 myapp 包中而不是工作流包下的建议。谁能告诉我我做错了什么?

AspectJ 1.6.8

【问题讨论】:

    标签: java aspectj aspect


    【解决方案1】:

    它记录来自每个包的每个方法调用

    不,它没有。它仅记录包com.myapp 及其所有子包中的每个方法,com.myapp.cms.workflow 内部和下方的所有内容除外。如果这不是你想要的,也许你应该改变你的切入点。

    顺便说一句,您为什么使用 2009 年以来过时的 AspectJ 版本?它只支持早已不支持的Java 6。


    更新:

    你似乎不相信我,这里有证据证明你的说法是错误的。

    根据您的示例的 Java 类:

    package com.myapp;
    
    public class Foo {
      public String convert(Integer number) {
        return number.toString();
      }
    }
    
    package com.myapp.cms.workflow;
    
    public class Workflow {
      public void doSomething() {}
    }
    
    package de.scrum_master.app;
    
    import com.myapp.Foo;
    import com.myapp.cms.workflow.Workflow;
    
    public class Application {
      // Should not be logged
      public static void main(String[] args) {
        // Should be logged
        new Foo().convert(11);
        // Should not be logged
        new Workflow().doSomething();
      }
    }
    

    方面根据您的示例:

    package de.scrum_master.aspect;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    
    @Aspect
    public class LogAspect {
      @Before("execution(* com.myapp..*.*(..)) && !execution(* com.myapp.cms.workflow..*.*(..))")
      public void logBefore(JoinPoint thisJoinPoint) {
          System.out.println(thisJoinPoint);
      }
    }
    

    我使用 Java 8 和 AspectJ 1.8.13 编译。我什至从控制台尝试了 AspectJ 1.6.8 和 Java 1.6.0_45,结果完全一样。

    控制台日志:

    execution(String com.myapp.Foo.convert(Integer))
    

    Ergo:一切都按预期进行。要么你没有向我展示你真正的切入点,要么你忘记了从类路径或其他任何东西中删除记录所有内容的另一个方面。 AspectJ 不是问题。我想问题出在电脑前面。

    【讨论】:

    • 我希望它按照您描述的方式运行,但它不起作用,它目前正在记录每个包中的每个方法,这不是我想要的。我的切入点看起来正确,但它不起作用。
    猜你喜欢
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多