不匹配此类型名称

Not Matching this type name

我在 com.aop.aspect 包中有很多方面 class。我想做的是工作所有 class 除了一个 class 命名为 com.aop.dao.MyDemoLoggingAspect

当我 运行 应用程序时,控制台上出现错误。

java.lang.IllegalArgumentException: warning no match for this type name: com.aop.dao.MyDemoLoggingAspect [Xlint:invalidAbsoluteTypeName]

这是我的方面class

@Aspect
public class LuvAopExpressionsOrder {

    @Pointcut("execution(* com.aop.dao.*.*(..))")
    public void forDaoPackage() {}

    // create pointcut for getter methods
    @Pointcut("execution(* com.aop.dao.*.get*(..))")
    public void getter() {}

    // create pointcut for setter methods
    @Pointcut("execution(* com.aop.dao.*.set*(..))")
    public void setter() {}

    // create pointcut for setter methods
    @Pointcut("!execution(* com.aop.dao.MyDemoLoggingAspect.*(..))")
    public void excludeMyDemoLoggingAspect() {}

    // create pointcut: include package ... exclude getter/setter and MyDemoLoggingAspect
    @Pointcut("forDaoPackage() && !(getter() || setter()) && excludeMyDemoLoggingAspect() ")
    public void forDaoPackageNoGetterSetter() {}

}

如果您使用 Spring AOP,您不必担心一个方面会拦截另一个方面的方法,因为 Spring 不支持这一点,如第 [=13= 章中所述].向下滚动一点并查找此信息框:

Advising aspects with other aspects?

In Spring AOP, aspects themselves cannot be the targets of advice from other aspects. The @Aspect annotation on a class marks it as an aspect and, hence, excludes it from auto-proxying.

所以基本上你的问题不是问题。

但是,如果您使用 AspectJ via LTW,则不受此类限制,因此必须小心排除通常会因匹配切入点而被拦截的其他方面。我建议将方面放在易于排除的包中,否则您必须按 class 名称 class 名称进行。根据您的情况使用这些切入点:

!within(com.aop.dao.MyDemoLoggingAspect)
!within(com.acme.aop..*)
!within(com.acme..*Aspect)