Spring AOP的实现原理
2016-12-02 11:04
239 查看
链接:https://www.zhihu.com/question/23641679/answer/105442105
AOP的实现原理是基于动态代理,这一点题主已经提到了。但是Spring是怎么通过动态代理来实现AOP的呢?这一点是题主的疑惑之一。
通过追踪Spring的源码,我们可以看看Spring究竟在AOP这方面究竟做了哪些东西?
(1)代理类的生成与载入
Spring通过ApplicationContext进行Bean的初始化(如果对这一部分有疑惑,请自行百度Spring Bean的生命周期),在这个过程中,我们可以通过以下源码比较清晰的看到在初始化容器过程中,Spring做了哪些事情?
<img src="https://pic3.zhimg.com/2d74025f453a667e6490dc5cd58d672a_b.png" data-rawwidth="1400" data-rawheight="912" class="origin_image zh-lightbox-thumb" width="1400" data-original="https://pic3.zhimg.com/2d74025f453a667e6490dc5cd58d672a_r.png">
而AOP的代理类以及拦截链则在finishBeanFactoryInitialzation这个方法中载入的。
在生成Proxy的过程中,我们来看看Spring究竟经过了哪些方法?
<img src="https://pic3.zhimg.com/cf6eb1de08bea9c725ff61b71e8f2bf2_b.png" data-rawwidth="1139" data-rawheight="486" class="origin_image zh-lightbox-thumb" width="1139" data-original="https://pic3.zhimg.com/cf6eb1de08bea9c725ff61b71e8f2bf2_r.png">很容易就看出来,代理类生成是在createProxy方法执行的。它经历以下几个步骤:
很容易就看出来,代理类生成是在createProxy方法执行的。它经历以下几个步骤:
(1)构建Advisor
(2)添加Advisor
(3)设置target Source
然后代理类初始化结束。这是AOP的第一个过程——初始化代理类。
之后开始进入AOP的第二个步骤,拦截。这就是我们接下来需要讲到的拦截链。
(2)拦截链的理解与阐述
在调用我们的业务方法前,Spring会根据之前的配置,进行一个拦截。我们可以看看核心代码帮助理解:
<img src="https://pic3.zhimg.com/3e8635c6ae68833272bfe68942bde3d2_b.png" data-rawwidth="1546" data-rawheight="915" class="origin_image zh-lightbox-thumb" width="1546" data-original="https://pic3.zhimg.com/3e8635c6ae68833272bfe68942bde3d2_r.png">
首先在拦截器中,它会搜索当前的方法是否具有Advice,如果有,那么它会执行MethodInvocation
当我们继续断点进去后,可以看到
<img src="https://pic2.zhimg.com/8222b4681d56c2a8380429081e67b8a5_b.png" data-rawwidth="1318" data-rawheight="678" class="origin_image zh-lightbox-thumb" width="1318" data-original="https://pic2.zhimg.com/8222b4681d56c2a8380429081e67b8a5_r.png">这一段核心的代码则可以解决题主关于拦截链的疑惑。
这一段核心的代码则可以解决题主关于拦截链的疑惑。
#补充
Spring AOP模型设计与理解
N/A
#Spring AOP执行步骤拆解
N/A
#其他
spring及其源码分析专辑
AOP的实现原理是基于动态代理,这一点题主已经提到了。但是Spring是怎么通过动态代理来实现AOP的呢?这一点是题主的疑惑之一。
通过追踪Spring的源码,我们可以看看Spring究竟在AOP这方面究竟做了哪些东西?
(1)代理类的生成与载入
Spring通过ApplicationContext进行Bean的初始化(如果对这一部分有疑惑,请自行百度Spring Bean的生命周期),在这个过程中,我们可以通过以下源码比较清晰的看到在初始化容器过程中,Spring做了哪些事情?
<img src="https://pic3.zhimg.com/2d74025f453a667e6490dc5cd58d672a_b.png" data-rawwidth="1400" data-rawheight="912" class="origin_image zh-lightbox-thumb" width="1400" data-original="https://pic3.zhimg.com/2d74025f453a667e6490dc5cd58d672a_r.png">
而AOP的代理类以及拦截链则在finishBeanFactoryInitialzation这个方法中载入的。
在生成Proxy的过程中,我们来看看Spring究竟经过了哪些方法?
<img src="https://pic3.zhimg.com/cf6eb1de08bea9c725ff61b71e8f2bf2_b.png" data-rawwidth="1139" data-rawheight="486" class="origin_image zh-lightbox-thumb" width="1139" data-original="https://pic3.zhimg.com/cf6eb1de08bea9c725ff61b71e8f2bf2_r.png">很容易就看出来,代理类生成是在createProxy方法执行的。它经历以下几个步骤:
很容易就看出来,代理类生成是在createProxy方法执行的。它经历以下几个步骤:
(1)构建Advisor
(2)添加Advisor
(3)设置target Source
然后代理类初始化结束。这是AOP的第一个过程——初始化代理类。
之后开始进入AOP的第二个步骤,拦截。这就是我们接下来需要讲到的拦截链。
(2)拦截链的理解与阐述
在调用我们的业务方法前,Spring会根据之前的配置,进行一个拦截。我们可以看看核心代码帮助理解:
<img src="https://pic3.zhimg.com/3e8635c6ae68833272bfe68942bde3d2_b.png" data-rawwidth="1546" data-rawheight="915" class="origin_image zh-lightbox-thumb" width="1546" data-original="https://pic3.zhimg.com/3e8635c6ae68833272bfe68942bde3d2_r.png">
首先在拦截器中,它会搜索当前的方法是否具有Advice,如果有,那么它会执行MethodInvocation
当我们继续断点进去后,可以看到
<img src="https://pic2.zhimg.com/8222b4681d56c2a8380429081e67b8a5_b.png" data-rawwidth="1318" data-rawheight="678" class="origin_image zh-lightbox-thumb" width="1318" data-original="https://pic2.zhimg.com/8222b4681d56c2a8380429081e67b8a5_r.png">这一段核心的代码则可以解决题主关于拦截链的疑惑。
这一段核心的代码则可以解决题主关于拦截链的疑惑。
#补充
Spring AOP模型设计与理解
N/A
#Spring AOP执行步骤拆解
N/A
#其他
spring及其源码分析专辑
相关文章推荐
- Spring AOP 实现原理与CGLIB应用
- spring AOP的几种方式及实现原理分析
- Spring AOP 实现原理
- Spring AOP 的实现 原理
- Spring AOP 实现原理与 CGLIB 应用
- spring AOP 实现原理模拟实现
- Spring AOP实现原理
- Spring AOP 实现原理与 CGLIB 应用
- Spring AOP 实现原理
- Spring AOP 实现原理
- Spring AOP 实现原理与 CGLIB 应用
- Spring AOP 实现原理
- Spring AOP 实现原理与 CGLIB 应用
- Spring Aop配置使用示例及实现过程和原理介绍
- Spring AOP 实现原理
- Spring AOP 实现原理
- Spring AOP的实现原理
- Spring AOP的实现原理之获取增强器Adivors
- Spring AOP 实现原理与 CGLIB 应用
- Spring AOP的实现原理之<aop:aspectj-autoproxy />的解析