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

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月于杭州

你可能感兴趣的:(spring)