1.spring AOP 會忽略切面類從父類繼承的方法,除非在切面類,也就是子類中對父類方法覆蓋@Override.
package com.skyline.dao;
@Repository
public class A{ public void a(){
//implements....
}
public void aa(){ //implements... }
}
package com.skyline.service;
@Service
public class B implements A{ @Autowired
private A a; public void b(){ //重復調用a.a()
} }
<aop:pointcut expression="execution(* com.skyline.service.*.*(..))" id="log_service"/> <aop:before pointcut-ref="log_service" method="doBefore"/>
如上述的例子中,用service 層的類繼承dao層的類就是為了不用在service 層再次寫調用dao層方法,避免代碼重復.
這樣帶來的問題之一就是AOP 只對service層自己定義的方法進行切入.如b().
如果改下切面如下:
<aop:pointcut expression="execution(* com.skyline.dao.*+.*(..))" id="log_service"/> <aop:before pointcut-ref="log_service" method="doBefore"/>
匹配表達式改為匹配dao 層,而+是表示"以及子類",上述expression 的意思就是匹配 dao層的所有類以及子類的所有方法.
現在是所有方法都會被切入,例如在調用 new B().aa() 這個方法,只會切入service 層,沒有切入dao層了.
但是問題是例如 B class 中的b() 方法,會重復調用父類 a(),這個a 也會不停的被切入.
我希望的是,只有在service 層調用時才會被切入,而希望service 方法內的父級方法不被切入的,只切入service 層就好.
再改成如下:
<aop:pointcut expression="execution(* com.skyline.dao.*+.*(..)) and !execution(* com.skyline.dao.*.*(..))" id="log_service"/> <aop:before pointcut-ref="log_service" method="doBefore"/>
想要排除dao層的方法,只切入子類方法就好.但是實際是父類dao層的類方法沒有被切入,繼承的子類的方法也沒有切入,和最開始只切service 層的效果是一樣了.
就是說不切入父類,就不能切入子類......
最后......淚奔....還是沒有找到滿意的方法...
