Spring框架(三)AOP切面程式設計

2021-10-05 23:16:49 字數 3189 閱讀 2938

「ioc控制反轉完成了解耦合,那麼功能擴充套件就交由我aop切面程式設計來完成吧」

當前某一類下有三個方法名曰:func1()、func2()、func3(),在實現方法中我們依次呼叫,那麼執行結果則是豎向呼叫。可現在面臨的問題是——專案的整體架構已經完成,我們需要在不破壞原先設計的條件下去新增新的功能,這該怎麼實現嘞?

這一問題就引入了切面:現在把某一方法當成切點(這裡假設成func2),在切點處橫斬一刀產生乙個切面,這個切面就是用於引入新功能的載體。(新技能,get成功!)

幾個常用名詞:

切點:即原有功能(func2)、前置通知:走在切點之前執行的功能(功能1)、後置通知:切點執行後緊隨其後的功能(功能2)、異常通知:切點處出現異常時執行的異常丟擲。以上功能總和構成整個切面,將切面嵌入的過程稱為織入

在spring中提供了兩種方式用於實現切面程式設計——schema-base和asceptj,這裡下面細寫,先導jar包(從現在開始本蒟蒻就開始使用開發神器idea啦

首先先手寫乙個demo類和乙個test 測試類,demo類下的三個方法用於設定切點方便測試,test 用於測試功能。在func2() 方法裡故意設定了乙個異常,用於測試切面程式設計的異常丟擲,測試時將注釋鬆開

package com.yang.test;

public class demo

public void func2() throws exception

public void func3()

}/這裡是兩個類之間吳迪的分界線/

package com.yang.test;

public class test catch (exception e)

demo.func3();}}

人都說spring的配bean勸退了不少初學者,確實怪麻煩的,不過自從換了idea之後啊,腰也不疼了,腿也不酸了(走錯片場了額 )

倒是節省了不少功夫。

spring對映檔案新增aop命名空間,編寫aop對映雛形。在官方幫助文件可以檢視或crtl+c(\滑稽)

<?xml version="1.0" encoding="utf-8"?>

前置通知、後置通知、異常丟擲、還有環繞通知這四個類,在這裡一併寫好,後面的就交託給spring對映檔案裡配bean處理一、前置通知,後置通知,異常丟擲 三類通知的對映編寫,執行時先遮蔽 func2() 方法中設定的異常,因為當觸發異常時,程式會中斷執行,走不到後置通知。看每個advice-ref 就可以字面翻譯出功能型別。

func1

執行前置通知

func2

執行後置通知

切面程式設計執行成功

func3

func1

執行前置通知

執行異常通知,schema-base/ by zero

func3

二、環繞通知:其意思大概就是 前置通知+後置通知,實現方式也挺簡便

func1

環繞-前置通知

func2

環繞-後置通知

func3

在這裡為了方便管理,把所有的通知方法寫入乙個myadvice 類下,直接用asceptj方式乙個乙個引入。

package com.yang.advice;

import org.aspectj.lang.proceedingjoinpoint;

public class myadvice

public void myafter()

public void myaftering()

public void mythrow()

public object myarround(proceedingjoinpoint p) throws throwable

}

對映部分則分標籤逐步定位到每乙個類下的每乙個方法,需要注意的是:第一、after 和 after-returning 同代表後置通知,但在對映裡誰靠前先執行誰。第二、after-returning只能在切點正常執行下才會執行,而after則無論有沒有異常都會執行

func1

這是乙個前置通知

這裡執行了環繞前置通知

func2

這裡執行了環繞後置通知

這是afterreturning式的後置通知

這是乙個後置通知

func3

如果切點帶引數,則在對映裡需要給繫結的方法新增引數,否則無法匹配

另外,如果通知方法中需要傳引數,則應在對用通知的對映中新增 arg-names 屬性

(2020.05.12新增)

隨後配置註解,切點處

@component

public class demo

}

通知處

@component

@aspect //表示該類是個切面通知類

public class myadvice

}

Spring 通過註解方式實現AOP切面程式設計

spring 切面程式設計的目的是實現 的業務邏輯的解耦。切面程式設計用於諸如日誌記錄,事務處理,等非業務性的邏輯操作。目前spring的aop只能應用於方法層級上,無法在類 成員欄位等層級上操作。以下是srping的aop程式設計分為註解方式和xml配置方式。以下過程詳細說明了通過註解方式實現ao...

Spring註解驅動 註解實現AOP切面程式設計

需求 在指定包下的所有類中的有方法都加上前置和後置通知。1.aop類,使用的註解 aspect表示當前的類為aop類 aspect public class logaop after execution service.public void doafter bean public logaop l...

Spring的面向切面AOP

aop 面向切面 通知 advice 在什麼時機呼叫該方法 spring提供了5種通知 切點 pointcut 標註需要使用到該通知的方法的位置 切面 aspect 是通知與切點的結合 spring提供了4種各具特色的aop支援 基於 的經典aop aspectj註解驅動的切面 純pojo切面 注入...