Spring 源码分析(三) —— AOP(六)源码分析与总结
2016-03-17 15:08
573 查看
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月于杭州)
相关文章推荐
- 一个jar包里的网站
- 一个jar包里的网站之文件上传
- 一个jar包里的网站之返回对媒体类型
- Spring整合Quartz(JobDetailBean方式)
- Spring整合Quartz(JobDetailBean方式)
- 模拟Spring的简单实现
- spring+html5实现安全传输随机数字密码键盘
- Spring中属性注入详解
- SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
- struts2 spring整合fieldError问题
- spring的jdbctemplate的crud的基类dao
- 读取spring配置文件的方法(spring读取资源文件)
- Spring Bean基本管理实例详解
- java实现简单美女拼图游戏
- 详解Java的Spring框架中的事务管理方式
- 解析Java的Spring框架的BeanPostProcessor发布处理器
- Java开发框架spring实现自定义缓存标签
- java基本教程之线程休眠 java多线程教程
- JSP开发中在spring mvc项目中实现登录账号单浏览器登录
- spring boot实战之内嵌容器tomcat配置