文档章节

Spring 源码分析(三) —— AOP(六)源码分析与总结

水门-kay
 水门-kay
发布于 2016/03/17 15:08
字数 1018
阅读 1344
收藏 39

Spring AOP 源码分析

        虽然我们仅仅分析了一部分,但在 Spring AOP 的基本实现中,我们可以看到 Proxy 代理对象的使用,在程序中是一个非常重要的部分,Spring AOP 充分利用 Java 的Proxy、反射以及第三方的 CGLIB 这些方案,通过这些技术,完成了 AOP AopProxy 代理对象的生成。

        回顾整个源码实现过程我们可以看到,首先通过配置 ProxyFactory 以及拦截器,然后以便 AopProxy 顺利的产生代理对象;配置的方式是由 ProxyFactoryBean 类来完成的,编程的方式是通过 ProxyFactory 来实现的。这两种 AOP 使用方式只是表面方式不一样,内在实现都是一样的。这里值得一提的是为了让 AopProxy 更好的工作,Spring 围绕他设计了许多接口和类,比如:专门生产工厂的 AopFroxyFactory  接口,专门用于生产对象的 DefaultAopFroxyFactory等等。

        而最终 AopProxy 代理对象的产生,会交给 JdkDynamicAopProxy 和 CglibAopProxy 这两个工厂来完成,用的就是我们最开始说到的技术。

        在完成 AopProxy 代理对象后,我们就可以对 AOP 切面逻辑进行实现了,首先会对这些方法进行拦截,从而为这些方法提供工作空间,随后在进行回调,从而完成 AOP 切面实现的一整个逻辑。而这里的拦截 JdkDynamicAopProxy  主要是通过内部的 invoke 方法来实现,而 CGLIB 是通过 getCallbacks 方法来完成的。他们为 AOP 切面的实现提供了舞台。

        最后,通过 AopProxy 接口中 getProxy 方法进行回调,然后在根据 Advice 增强来完成具体逻辑。


总结

        Spring AOP 秉承 Spring 一贯的设计理念,致力于 AOP 框架与 IOC 容器的紧密集成,以此来为 J2EE 的开发人员服务。这里仅仅介绍了一部分,还有很多地方都很值得大家去仔细专研。当然,AOP 的实现时一个三足鼎立的世界:AspectJ、JBoss AOP、Spring AOP。如果你有兴趣,除了 Spring AOP 以外 AspectJ 和 JBoss AOP 是非常值得大家研究以及借鉴的。

        特别是 AspectJ。我们知道 Spring 的增强都是用标准的 Java 类编写的。我们可以用一般的 Java 开发环境进行开发切面,虽然好用,但是开发人员必须对 Java 开发相当熟悉,仅仅使用 Java 也有一定的局限性。而 AspectJ 与之相反,他专注于切面的开发,虽然最初也仅仅是作为 Java 语言的扩展方式来实现,但通过特有的 AOP 语言,我们可以获得更强大以及细颗粒的控制,从而丰富了 AOP 工具集。所以 Spring AOP 为弥补自身的不足,在源码中集成了 AspectJ 框架,有兴趣大家也可以去研究一下。


太史公曰

        Spring AOP 与其说是一种方便的应用,不如,说是大家在用 Spring IOC 封装时的一种补充,他很好的弥补了 OOP 思想在模块化时的不足,使你的模块化相对完美。所以,我觉得,他应该是每个用 Spring 开发的程序员必须掌握的一个技巧。

        另外,Spring AOP 的实现由很多种,就是这里仅仅是提供了一个源码分析的思路,以及是笔者认为重要的地方尽量的带入。

        好了,写了一个多星期,终于可以好好休息一下了。下一篇,我会写大家比较关心的 Spring MVC 的源码分析,希望自己能越写越好吧。



——水门(2016年3月于杭州

© 著作权归作者所有

水门-kay
粉丝 460
博文 19
码字总数 59660
作品 0
杭州
后端工程师
私信 提问
加载中

评论(1)

haoqidede
haoqidede
正发愁如何看源码 博主给了大致思路 非常棒
Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密...

小致Daddy
2018/08/03
21.9K
1
那些年,我们一起追的Spring

学无止境,但仍需及时总结。 自去年开始写作以来,写了一些关于Spring的文章,今天将它们汇总起来,一方面方便大家阅读,另一方面,也是一次小的复盘总结。 IOC 首先是Spring的IOC,也就是控...

SexyCode
2018/08/14
0
0
Spring AOP 源码分析 - 筛选合适的通知器

1.简介 从本篇文章开始,我将会对 Spring AOP 部分的源码进行分析。本文是 Spring AOP 源码分析系列文章的第二篇,本文主要分析 Spring AOP 是如何为目标 bean 筛选出合适的通知器(Advisor...

java高级架构牛人
2018/06/21
25
0
Spring MVC 原理探秘 - 容器的创建过程

1.简介 在上一篇文章中,我向大家介绍了 Spring MVC 是如何处理 HTTP 请求的。Spring MVC 可对外提供服务时,说明其已经处于了就绪状态。再次之前,Spring MVC 需要进行一系列的初始化操作。...

coolblog.xyz
2018/07/03
0
0
Spring IOC 容器源码分析 - 填充属性到 bean 原始对象

1. 简介 本篇文章,我们来一起了解一下 Spring 是如何将配置文件中的属性值填充到 bean 对象中的。我在前面几篇文章中介绍过 Spring 创建 bean 的流程,即 Spring 先通过反射创建一个原始的 ...

coolblog.xyz
2018/06/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

3_数组

3_数组

行者终成事
今天
7
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部