本文旨在让读者对SpringAOP实现原理有一个宏观的认识,所以会遗漏一些细节。在阅读本文之前,希望读者对SpringIoc和SpringAOP的使用一定有所了解,不多说,直接准备上图中的Service类:有find方法而save方法,find方法前后需要缓存操作,save方法前后需要事务操作。CacheableAspect切面类:用于Service的find方法前后进行缓存操作TransctionlAspect切面类:用于Service的save方法中的事务操作LogAspect切面类:记录所有Controller请求日志SpringAOP自动代理时机是在服务bean创建期间process(即getBean("service")),AOP通过BeanPostProcess后处理器操作介入分为两种情况:用户定义targetSource,bean的创建(实例化、填充、初始化)由用户负责,而SpringIoc不会管理代理目标对象traget,这种情况基本不会发生。很多人用了几年Spring可能都不知道它的存在。一般情况下,SpringIoc完成代理对象target的实例化、填充和初始化。然后介入后初始化处理器,为bean创建代理,也就是服务,创建代理操作wrapIfNecessary。我们以Jdk动态代理为例,方法调用会触发invoke方法。SpringAOP拦截器的执行顺序从上面可以看出,SpringAOP的proxyinvoke方法其实就是拦截器的执行。我们先了解下SpringAOP的执行顺序,和栈很像。AOP拦截器执行后进先出的原则,那么这个拦截器链是如何保证beforeisbeforeafter的呢?还有你能保证find方法的执行顺序吗?这部分实现原理不是三言两语能说清楚的,只能给大家一张图来理解拦截器的具体源码:@OverridepublicObjectinvoke(MethodInvocationmi)throwsThrowable{//先调用before方法this.advice.before(mi.getMethod(),mi.getArguments(),mi.getThis());//继续链式调用returnmi.proceed();}}公共类AfterReturningAdviceInterceptor实现MethodInterceptor、AfterAdvice、Serializable{私有最终AfterReturningAdvice建议;@OverridepublicObjectinvoke(MethodInvocationmi)throwsThrowable{//先进行链式调用ObjectretVal=mi.proceed();//再次调用afterReturning方法this.advice.afterReturning(retVal,mi.getMethod(),mi.getArguments(),mi.getThis());返回值;}}压轴题:SpringAOP遇到循环依赖。这部分的难度系数是十颗星。可以说是最复杂的一段Spring源码了。可以说对Spring的理解已经达到了阿里的水平。在这里三言两语无法解释清楚,只能贴张图片,大家有个宏观的认识。总结SpringAOP是Spring的重要组成部分之一。本文只是给读者一个宏观的认识,具体需要阅读源码。
