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 层的效果是一样了.

就是说不切入父类,就不能切入子类......

最后......泪奔....还是没有找到满意的方法...

原文地址:https://www.cnblogs.com/predisw/p/4792297.html