鉴于这些切入点,从下面的资源采取:在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包里面,所以我实在看不出对使用+在这里签字...
我错了吗?有没有我可能看不到的边缘案例?
在这个例子中真的需要加号吗?
感谢您的关注!
使用'但不在com.webtier包中',你的意思是即使是一个类com.any.other.package。如果类扩展了com.webtier包的一个类或实现了'com.webtier'包的一个接口,那么在其任何方法执行流程中调用'Foo'方法的WebTierTypeSubclass'会匹配吗? – tonix 2015-04-02 15:27:49
是的,从'com.any.other.package.WebTierTypeSubclass'调用,如果该类型在'com.webtier'中扩展了一个类型(或者实现了一个接口),那么'* +'将会捕获它,'*'将不会。另外,如果你想要考虑像com.webtier.somesubpackage.Bar这样的子包中的类型,你应该使用''':call(* com.webtier .. * +。*(..))' – 2015-04-02 15:34:15
谢谢! (15个字符) – tonix 2015-04-02 15:40:29