Spring AOP實現原理(一)AOP簡介

前言

Spring AOP是Spring衆多優秀特性中的一個,我一直對它的實現比較好奇,最近有些閒暇時間,就整理了一些有關Spring AOP實現的資料。在整理的過程當中,又稍做深刻的理解一些優秀的框架和工具,好比asm,CGLIB,AspectJ等,頓覺本身知識淺薄,固然也難以抑制分享的衝動,因而就決定作一個系列文章——Spring AOP實現原理。html

文章總共分爲5部分:spring

  1. AOP簡介編程

  2. 實現一個簡單的AOP緩存

  3. 動態代理:JDK Proxy 和 CGLIBbash

  4. Spring AOP特性解讀框架

  5. Spring AOP源碼解析eclipse

筆者認爲重點是3和5,這兩部分針對實現原理作了深刻的探討,有必定基礎的同窗建議直接閱讀重點部分。ide

AOP簡介

AOP是什麼

aspect-oriented programming (AOP) is a programming paradigm that aims to increase modularity by allowing the separation of cross-cutting concerns. It does so by adding additional behavior to existing code (an advice) without modifying the code itself, instead separately specifying which code is modified via a "pointcut" specification, such as "log all function calls when the function's name begins with 'set'". This allows behaviors that are not central to the business logic (such as logging) to be added to a program without cluttering the code, core to the functionality. AOP forms a basis for aspect-oriented software development.

Wiki對AOP的定義,AOP是一種編程範式,目的是爲了將跨領域的關注點分離出來以達到模塊化。它能夠向現存代碼中增長行爲邏輯而不用修改原有代碼,它是經過指定切入點(pointcut)來實現的,例如向以set爲開頭的函數(function)中增長日誌功能。它能夠實現將一些不是核心的業務邏輯(如日誌等)添加到程序中,而不會使核心代碼混亂。AOP爲面向方面的軟件開發奠基了基礎。模塊化

從定義中,咱們提取幾個關鍵字:函數

  • 編程範式,和麪向對象編程相似,AOP也是一種編程範式,它是面向切面編程
  • 模塊化,將程序模塊化是AOP的追求目標
  • 非核心業務邏輯,AOP應用於日誌、監控等這種非核心業務中

咱們以一個簡圖來講明:

從圖中能夠看出,業務A和業務B中都有log業務,面向切面的編程思想就將這些log業務從主業務中剝離出來,單獨造成一個切面(Aspect),而後在切面中進行處理(Advice).

AOP中有哪些概念

咱們以AspectJ的接入點模型(join-point model)爲例,說明一下AOP中的概念

  • 接入點(Join Point):方法調用,構造器調用,初始化class,實例化對象,成員變量的讀寫,異常處理等均可以成爲接入點

  • 切點(PointCuts):表明了一些接入點(Join Point)的集合,好比:

    execution(* set*(*))
    複製代碼

    以方法接入點爲示例,表達式表明了匹配以set爲開頭而且只有一個參數的方法

  • Advice:指的能夠在接入點的前(before),中(around),後(after)執行的代碼

  • 切面(Aspect):切面像是一個抽象出來的類,它不只融合了以上的元素,它也能夠包含本身的屬性,方法等,固然,切面也能夠被實例化。在Spring AOP中,切面的應用較爲簡單,爲了便於理解,咱們能夠把切面理解爲一個實現具體業務的類,例如計算Dao層方法執行時間的類。

注:AspectJ中的AOP實現比Spring AOP複雜的多,本文主要以理解Spring AOP爲目的,不作深刻的探討,有興趣進一步學習的同窗能夠參考附件中的AspectJ的官方文檔

AOP的應用場景

前面咱們提到AOP主要應用一些非核心業務邏輯中,咱們看看AOP常見的應用場景

  • 監控
  • 日誌
  • 緩存
  • 鑑權
  • 事務
  • 異常處理
  • 持久化

引用資料

Wiki:en.wikipedia.org/wiki/Aspect…

AspectJ:www.eclipse.org/aspectj/doc…

Spring AOP:docs.spring.io/spring/docs…

相關文章
相關標籤/搜索