【问题标题】:AspectJ pointcut expression for all classes that contains a especific word in their names名称中包含特定单词的所有类的 AspectJ 切入点表达式
【发布时间】:2015-12-06 01:46:06
【问题描述】:

怎么了?伙计们!

我正在尝试拦截名称中包含特定单词的所有类...如下所示:

@Before("execution(* com.domain.model.*.*Repository.save(..))")

我有以下方法拦截:

com.domain.model.user.UserRepository.save(User user);
com.domain.model.xpto.XPTORepository.save(XPTO xpto);
com.domain.model.foo.FooRepository.save(Foo foo);

我试过这个:(有效,但看起来很糟糕)

@Before("execution(* *.save(..)) && within(com.domain.model..*)")
public void validateBeforeSave(final JoinPoint jp) throws Throwable {
    if (jp.getSignature().toString().contains("Repository.")) {
        ...
    }
}

谢谢!!!

【问题讨论】:

    标签: expression aspectj contains classname pointcut


    【解决方案1】:

    你自己的建议有什么问题?

    execution(* com.domain.model.*.*Repository.save(..))
    

    应该可以很好地使用您提供的示例包 + 类名。如果不起作用,则您的真实包名称不同,例如您在model 下有多个子包。在这种情况下,您可以使用 .. 构造使切入点更通用,该构造也用于您的丑陋解决方法:

    execution(* com.domain.model..*Repository.save(..))
    

    或者你的 *Repository 类都继承自一个公共超类或实现相同的接口,例如interface com.domain.model.Repositoryabstract class com.domain.model.BaseRepository。在这种情况下,您可以不使用字符串匹配,而只需使用类似

    execution(* com.domain.model.Repository+.save(..))
    

    execution(* com.domain.model.BaseRepository+.save(..))
    

    + 表示“这个类及其所有子类”。

    【讨论】:

      猜你喜欢
      • 2015-03-19
      • 2015-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 2014-11-17
      相关资源
      最近更新 更多