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 层的效果是一样了.
就是说不切入父类,就不能切入子类......
最后......泪奔....还是没有找到满意的方法...