技术文技术干货程序员

Spring技术内幕(二):AOP(二)

2017-04-12  本文已影响0人  WhyNotYue

四,Spring AOP拦截器调用的实现


1. 设计原理

  1. 在Spring AOP通过JDK的Proxy方式或者CGLIB方式生成代理对象的时候,相关的拦截器已经配置到代理对象中去了。
  2. 设置拦截器回调

2. JdkDynamicAopProxy的invoke拦截


3. Cglib2AopProxy的intercept拦截


4. 目标对象方法的调用


5. AOP拦截器链的调用


6. 配置通知器

  1. proceed方法中interceptorOrInterceptionAdvice链来自interceptorsAndDynamicMethodMatchers持有的List的一个元素
  2. 而List中的拦截器元素在JDKDynamicAopProxy中的invoke方法或Cglib2AopProxy中DynamicAdvisedInterceptor的intercept回调中实现,并且我们可以从中看出获取interceptors的操作在advised对象完成。
  3. 这个advised是一个AdvisedSupport对象


    AdvisedSupport取得拦截器.png
  1. 在ProxyFactoryBean的getObject方法中对advisor进行初始化


    在拦截器链的初始化中获取advisor通知器.png

    通过对IOC容器的一个getBean回调,得到配置好的advisor通知器


7. Advice通知的实现

  1. DefaultAdvisorChainFactory(负责生成拦截器链)使用GlobalAdvisorAdapterRegistry得到AOP拦截器
  2. GlobalAdvisorAdapterRegistry的实现:单件设计模式,保证所要生成对象的唯一性


    单件设计模式.png
  1. DefaultAdvisorAdapterRegistry设置了一系列adapter适配器,为Spring AOP的advice提供编织能力。
  2. 以MethodBeforeAdviceAdapter为例,把advice通知从通知器中取出,通过MethodBeforeAdviceInterceptor对象把取得的advice通知包装起来。在MethodBeforeAdviceInterceptor方法中,会先调用advice的before方法,在方法调用之前完成通知增强。

8. ProxyFactory实现AOP

上面的分析着重讲解了以ProxyFactoryBean为例Spring AOP的实现原理,除此之外,ProxyFactory也可以实现Spring AOP,而且原理也差不多,只不过后者需要编程式地完成AOP应用的设置。


ProxyFactory.png

参考资料:Spring技术内幕(第2版) 计文柯

上一篇 下一篇

猜你喜欢

热点阅读