雖然咱們僅僅分析了一部分,但在 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 框架,有興趣你們也能夠去研究一下。spa
Spring AOP 與其說是一種方便的應用,不如,說是你們在用 Spring IOC 封裝時的一種補充,他很好的彌補了 OOP 思想在模塊化時的不足,使你的模塊化相對完美。因此,我以爲,他應該是每一個用 Spring 開發的程序員必須掌握的一個技巧。
設計
另外,Spring AOP 的實現由不少種,就是這裏僅僅是提供了一個源碼分析的思路,以及是筆者認爲重要的地方儘可能的帶入。代理
好了,寫了一個多星期,終於能夠好好休息一下了。下一篇,我會寫你們比較關心的 Spring MVC 的源碼分析,但願本身能越寫越好吧。
orm
——水門(2016年3月於杭州)