2017-03-14 25 views
0

我试图定义一个可以匹配类中所有方法的切入点,但它不起作用。 我尽力找出原因。 我最终找到了我定义的切入点表达式的故障点。Pointcut表达式中两个连续的星号是什么意思?

以下是我首先定义的开始。 (不工作)

@Pointcut("execution(** membership.data.MemberRepository.*(..))") 

正如我已经知道,在连续两个星号“执行(**”是指任何访问修饰符和任何返回类型,但它永远不会匹配具有某种返回类型的一些方法像这样:

public List<MemberVO> findByName(String name) { ... 

在另一方面,它匹配另一个是这样的:

public String print(String str) { ... 

而下面的定义它的正确方法,我发现了开始时这些比赛。上述两种方法签名并且正常工作。

@Pointcut("execution(public * membership.data.MemberRepository.*(..))") 

@Pointcut("execution(* membership.data.MemberRepository.*(..))") 

我错过了什么?我努力寻找答案,但从未出现过。 请让我知道的确切含义“执行(**”

增加:纵横类

@Aspect 
public class PerformanceLogger { 

    @Pointcut("execution(* membership.data.MemberRepository.*(..))") 
    public void performance() {} 

    @Around("performance()") 
    public Object watchPerformance(ProceedingJoinPoint jp) { 
     try { 
      long st = System.nanoTime(); 
      Object obj = jp.proceed(); 
      System.out.println(jp.toShortString() + " called :" + (System.nanoTime() - st)); 
      return obj; 
     } catch (Throwable e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 
+0

也许两个'*'之间有空格? – Andreas

+0

@Andreas我试图在两者之间放置一个空格,如下所示:“execution(* * ..”,并且在初始化具有切入点表达式的aspect bean时引发异常 – ParkCheolu

+0

为什么你不能共享完整的切入点和方法签名?这样你就不会得到有意义的答案。请学习[如何提出问题](http://stackoverflow.com/help/how-to-ask),并提供[最小,完整和可证实的例子](http://stackoverflow.com/help/mcve)。谢谢。哦,顺便说一下:'**'根本没有任何意义。我已经可以告诉你了。你的问题在于这个部分你从我们这里隐藏起来 – kriegaex

回答

0

的全部源代码正如我在我的评论说:**并不意味着什么,你幸运的是,解析器似乎将其解释为等同于*,但您无法确定,实际上它应该会产生语法错误,所以请不要使用它,这是没有意义的。您对关于含义的假设仅仅是假的。* * blah(..)也可以不工作,这是无效的语法。IMO应该在“Spring in Action”一书中修复,我也在那里找到它。在整个AspectJ文档中,你不会找到som像**

至于你的问题:为了让所有的方法执行类membership.data.MemberRepository您使用切入点execution(* membership.data.MemberRepository.*(..))。你已经发现了你自己。

相关问题