Spring AOP基礎簡介

ckxllf發表於2019-08-21

  什麼是AOP

  AOP即面向切面程式設計。

  面向切面——Spring提供了面向切面程式設計的豐富支援,允許透過分離應用的業務邏輯與系統級服務(例如審計(auditing)和事務(transaction)管理)進行內聚性的開發。應用物件只實現它們應該做的——完成業務邏輯——僅此而已。它們並不負責(甚至是意識)其它的系統級關注點,例如日誌或事務支援。

  AOP中的基本概念

  通知(Adivce)

  通知有5種型別:

  Before:在方法被呼叫之前呼叫

  After:在方法完成後呼叫通知,無論方法是否執行成功

  After-returning:在方法成功執行之後呼叫通知

  After-throwing:在方法丟擲異常後呼叫通知

  Around:通知了好、包含了被通知的方法,在被通知的方法呼叫之前後呼叫之後執行自定義的行為

  切點(Pointcut)

  切點在Spring AOP中是對應系統中的方法。但是這個方法是定義在切面中的方法,一般和通知一起使用,一起組成了切面。

  連線點(Join point)

  比如:方法呼叫、方法執行、欄位設定/獲取、異常處理執行、類初始化、甚至是 for 迴圈中的某個點

  理論上, 程式執行過程中的任何時點都可以作為作為織入點, 而所有這些執行時點都是 Joint point

  但 Spring AOP 目前僅支援方法執行 (method execution),也可以這樣理解,連線點就是你準備在系統中執行切點和切入通知的地方(一般是一個方法,一個欄位)

  切面(Aspect)

  切面是切點和通知的集合,一般單獨作為一個類。通知和切點共同定義了關於切面的全部內容,它是什麼時候,在何時和何處完成功能。

  引入(Introduction)

  引用允許我們向現有的類新增新的方法或者屬性

  織入(Weaving)

  組裝方面來建立一個被通知物件。這可以在編譯時完成(例如使用AspectJ編譯器),也可以在執行時完成。Spring和其他純Java AOP框架一樣,在執行時完成織入。

  Spring中對AOP的支援

  首先AOP思想的實現一般都是基於代理模式,在JAVA中一般採用JDK動態代理模式,但是我們都知道,JDK動態代理模式只能代理介面,如果要代理類那麼就不行了。因此,Spring AOP 會這樣子來進行切換,因為Spring AOP 同時支援 CGLIB、ASPECTJ、JDK動態代理,當你的真實物件有實現介面時,Spring AOP會預設採用JDK動態代理,否則採用cglib代理。

  如果目標物件的實現類實現了介面,Spring AOP 將會採用 JDK 動態代理來生成 AOP 代理類;

  如果目標物件的實現類沒有實現介面,Spring AOP 將會採用 CGLIB 來生成 AOP 代理類——不過這個選擇過程對開發者完全透明、開發者也無需關心。

  程式碼示例

  定義主題介面,這些介面的方法可以成為我們的連線點

  package wokao666.club.aop.spring01;

  public interface Subject {

  //登陸

  public void login();

  //下載

  public void download();

  }

  定義實現類,這是代理模式中真正的被代理人(如果你有參與代購,這個就像你在代購中的角色)

  package wokao666.club.aop.spring01;

  public class SubjectImpl implements Subject {

  public void login() {

  System.err.println("借書中...");

  }

  public void download() {

  System.err.println("下載中...");

  }

  }

  定義切面(切面中有切點和通知)

  package wokao666.club.aop.spring01;

  public class PermissionVerification {

  /**

  * 許可權校驗

  * @param args 登陸引數

  */

  public void canLogin() {

  //做一些登陸校驗

  System.err.println("我正在校驗啦!!!!");

  }

  /** 無錫婦科檢查醫院

  * 校驗之後做一些處理(無論是否成功都做處理)

  * @param args 許可權校驗引數

  */

  public void saveMessage() {

  //做一些後置處理

  System.err.println("我正在處理啦!!!!");

  }

  }

  SpringAOP.xml檔案

  xmlns:xsi="

  xmlns:aop="

  xmlns:tx="

  xsi:schemaLocation="

  /spring-beans-4.2.xsd

  

  /spring-aop-4.2.xsd">

  測試類和結果

  package wokao666.club.aop.spring01;

  import org.springframework.context.ApplicationContext;

  import org.springframework.context.support.ClassPathXmlApplicationContext;

  public class Test {

  public static void main(String[] args) {

  ApplicationContext ctx =

  new ClassPathXmlApplicationContext("SpringAOP.xml");

  Subject subject1 = (Subject)ctx.getBean("SubjectImpl1");

  Subject subject2 = (Subject)ctx.getBean("SubjectImpl2");

  subject1.login();

  subject1.download();

  System.err.println("==================");

  subject1.login();

  subject1.download();

  }

  }

  資訊: Loading XML bean definitions from class path resource [SpringAOP.xml]


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2654414/,如需轉載,請註明出處,否則將追究法律責任。

相關文章