spring 之AOP 和繼承方法


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 層的效果是一樣了.

就是說不切入父類,就不能切入子類......

最后......淚奔....還是沒有找到滿意的方法...

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM