实际应用中,controller一般都会去继承一个基础类,该基础类一般都是都对缓存、用户信息、返回值的一些通用处理。现在我想针对这个基础类的一个方法进行切面,处理一些东西,遇到的第一个问题就是,切面的切入的方法是 public 的,但通用基础类,人家本来也只是供其继承者使用的,所以通常方法的最大权限也不过是 protect , 所以其实这里就应该把我劝退了,但我没管,直接将方法改成了public。
然后信心满满地进行下一步,发现切面完全没作用,百度了一天,以为是配置不对,各种改,就是不见效果。然后找到下面这篇文章
https://blog.csdn.net/aosica321/article/details/58039299
原来是因为我切的那个方法是被同类中的另一个方法调用,这种调用不是调用的代理类中的方法,所以切不进去。
此时只要将方法发射到代理对象,即使用
((目标类) AopContext.currentProxy()).目标方法()
就可完成切面增强,但同时需要配置
<aop:aspectj-autoproxy expose-proxy="true"/>
但我就疑惑了,这样岂不是会动源代码,就类似与在源代码我手动加了个切口,告诉切面不用找了,从这里进。但是切面的意义不就在于不动源码,然后能有另外的逻辑处理吗?这样做跟一般意义上的普通方法调用区别也没有很大。到此,我决定换思路了,但这个过程也不失为一个切面学习踩坑的经验。