鉴于这些切入点来自以下资源:
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包内,它仍然匹配所有内容(任何类,抽象类子类,接口实现),因此我在这里看不到+号的用法...
我错了吗?有一些我可能看不到的极端情况吗?
在此示例中,加号真的必要吗?
感谢您的关注!
最佳答案
如果使用的类型在com.webtier
包中子类型化但不在com.webtier
包中,则加号会有所不同。加号表示在计算cflow时还将考虑这些类型。如果在您的应用程序中没有发生这种情况,那么加号不会有任何区别。
您的Foo类是否在com.webtier
包中,这也有所不同。如果是,则对它的调用始终在call(* com.webtier.*+.*(..))
的cflow中。如果是这种情况,我可能会使用cflowbelow
而不是cflow
。