2015-04-01 113 views
1

鉴于这些切入点,从下面的资源采取:在AspectJ中匹配类时,* +和*之间的区别?

http://maverick-amey.blogspot.ru/2007/12/using-cflow-and-cflowbelow-in-pointcuts.html

pointcut methodCalls() : 
        call(public void Foo.*(..)) ; 

pointcut methodCallFromWebTier() : 
        methodCalls() && cflow(call(* com.webtier.*+.*(..))); 

methodCallFromWebTier切入点应该匹配到Foo类的任何公开的方法制成与返回void任何参数的所有电话前提条件是& &运营商)呼叫是控制流程内ÿ调用的的方法制备:在com.webtier

  • 任何类(及其子类);
  • 任何抽象类(其子类)在com.webtier包;
  • com.webtier包在com.webtier包中的任何接口的任何接口的实现;

现在,如果切入点将是这个:

pointcut methodCallFromWebTier() : 
        methodCalls() && cflow(call(* com.webtier.*.*(..))); 

因此没有+亚型TypePattern运营商,将切入点是一样的吗?我的意思是,它仍然匹配一切(任何类,抽象类的子类,接口实现),前提是该一切com.webtier包里面,所以我实在看不出对使用+在这里签字...

我错了吗?有没有我可能看不到的边缘案例?

在这个例子中真的需要加号吗?

感谢您的关注!

回答

2

如果您使用com.webtier软件包中的类型进行子类型处理,但不在com.webtier软件包中,则该加号会有所作为。加号意味着在计算cflow时也会考虑这些类型。如果这在您的应用程序中没有发生,那么这个加号就没有区别。

您的Foo课程是否在com.webtier包中也有区别。如果是,那么调用它总是在call(* com.webtier.*+.*(..))的cflow中。如果是这种情况,我可能会使用cflowbelow而不是cflow

+0

使用'但不在com.webtier包中',你的意思是即使是一个类com.any.other.package。如果类扩展了com.webtier包的一个类或实现了'com.webtier'包的一个接口,那么在其任何方法执行流程中调用'Foo'方法的WebTierTypeSubclass'会匹配吗? – tonix 2015-04-02 15:27:49

+1

是的,从'com.any.other.package.WebTierTypeSubclass'调用,如果该类型在'com.webtier'中扩展了一个类型(或者实现了一个接口),那么'* +'将会捕获它,'*'将不会。另外,如果你想要考虑像com.webtier.somesubpackage.Bar这样的子包中的类型,你应该使用''':call(* com.webtier .. * +。*(..))' – 2015-04-02 15:34:15

+0

谢谢! (15个字符) – tonix 2015-04-02 15:40:29