Spring AOP的底层执行机制 - 详解

Spring会先扫描所有的被@Controller或者@Service,@Component注解注释的类,将他们初始化为合适的Bean对象,@Aspect和@Component组合的注解类也会被注册为Bean对象,但是有点不一样,Spring会根据@Aspect的注解从Bean对象中找出他的Pointcut(切点),然后,重新扫描几乎所有的Bean对象,看看Bean对象中的方法能不能被Pointcut切点表达式匹配到,如果能,那么就给这个方法的类重新生成代理Bean对象(代理对象中的target属性是原始Bean对象),最终把代理对象还有没有匹配成功的原始Bean对象放到Spring容器中,用到的时候进行自动注入。在调用代理对象的方法的时侯呢,

如果是CGLIB动态代理生成的代理对象,那么的话,结构如上,调用手段的时候,会使用重写后的原始方式,会先通过方法------>方法对应的拦截器链来获取到一个拦截器链对象,然后会生成一个ReflectiveMethodInvocation对象,调用这个对象中的proceed方法,proceed的执行逻辑和ReflectiveMethodInvocation的结构大致如下:

就比如说,在执行代理对象的技巧的时候,拿到一个拦截器链对象[AroundInterceptor1] → [AroundInterceptor2],因为此时执行proceed的时候,还没有到最后一个拦截器对象,所以不会调用原始的途径,会调用AroundInterceptor1的invoke(this)函数,this指的是以[AroundInterceptor1]为体构造的ReflectiveMethodInvocation对象,在invoke函数中:

已经到达了最后一个拦截器对象,那么就执行原方法的invoke调用,返回一个正常的类型,然后调用AroundInterceptor2]的后置逻辑,最后调用[AroundInterceptor1]的后置逻辑,达成该方法的调用。就是会先根据拦截器的类型,是否调用前置逻辑啥的,然后,会调用该ReflectiveMethodInvocation对象的proceed方法,发现还不是最终一个拦截器对象,获取到最终一个拦截器对象[AroundInterceptor2],然后调用[AroundInterceptor2]的invoke函数,invoke函数的参数是以[AroundInterceptor2]为体构造的ReflectiveMethodInvocation对象,然后在这个invoke函数中执行AroundInterceptor2]对应的逻辑,调用以[AroundInterceptor2]为体构造的ReflectiveMethodInvocation对象的proceed方法,在这个方法中,发现这个

posted on 2025-08-05 08:08  ljbguanli  阅读(12)  评论(0)    收藏  举报