springboot從零實現乙個AOP

2021-10-16 09:18:52 字數 3579 閱讀 8825

在我們開發的過程中經常會有這樣的需求,每乙個請求需要判斷許可權,校驗引數,列印日製等,但是每乙個方法都寫這樣重複的**無疑會讓**很冗餘,於是可以想到用aop切面的方式可以一次性解決所有的煩勞。

其實我們通過aop機制可以實現:authentication 許可權檢查、caching 快取、引數校驗、context passing 內容傳遞、error handling 錯誤處理、日誌列印等功能,這裡我們講一下怎麼從0開始手寫乙個spring aop來實現前置通知或後置通知。

一:新增pom依賴

org.springframework.boot<

/groupid>

spring-boot-starter-aop<

/artifactid>

<

/dependency>

二:新建乙個aop包,定義乙個切面

一般會專門新建乙個包用來處理aop,我這裡新建乙個package org.sang.org.sang.advice包,並且新建乙個logadvice類。

package org.sang.org.sang.advice;

import org.aspectj.lang.annotation.aspect;

import org.aspectj.lang.annotation.pointcut;

import org.springframework.stereotype.component;

/** * create by 86159 on 2020/11/2

*/@aspect

@component

public

class

logadvice

這裡注意要加上註解@aspect,申明是個切面類,@component能夠掃瞄到。

三:定義乙個切面

package org.sang.org.sang.advice;

import org.aspectj.lang.annotation.aspect;

import org.aspectj.lang.annotation.pointcut;

import org.springframework.stereotype.component;

/** * create by 86159 on 2020/11/2

*/@aspect

@component

public

class

logadvice

}

四:前置通知

package org.sang.org.sang.advice;

import org.aspectj.lang.annotation.aspect;

import org.aspectj.lang.annotation.before;

import org.aspectj.lang.annotation.pointcut;

import org.springframework.stereotype.component;

/** * create by 86159 on 2020/11/2

*/@aspect

@component

public

class

logadvice

@before

("logadvicepoint()"

)public

void

beforeadvice()

}

在切面的基礎上構建前置通知,前置通知是用@before註解,括號裡的引數為切面的名稱,前置通知的方法體內為在呼叫方法前要處理的業務邏輯,比如許可權校驗,引數校驗等等。

五:後置通知

package org.sang.org.sang.advice;

import org.aspectj.lang.annotation.after;

import org.aspectj.lang.annotation.aspect;

import org.aspectj.lang.annotation.before;

import org.aspectj.lang.annotation.pointcut;

import org.springframework.stereotype.component;

/** * create by 86159 on 2020/11/2

*/@aspect

@component

public

class

logadvice

@before

("logadvicepoint()"

)public

void

beforeadvice()

@after

("logadvicepoint()"

)public

void

afteradvice()

}

後置通知用@after註解,同樣括號裡為切面名稱,方法體內為呼叫方法完成後需要處理的業務邏輯,如列印日誌記錄。

下面我們寫個方法測試下效果:

package org.sang.controller;

import org.sang.model.entity.user;

import org.sang.service.userservice;

import org.springframework.beans.factory.annotation.autowired;

import org.springframework.validation.annotation.validated;

import org.springframework.web.bind.annotation.*;

@restcontroller

(value =

"/user"

)public

class

usercontroller

我們用postman呼叫方法測試結果如下:

post請求advice被觸發了。。。。。。。。。。。。,校驗許可權,引數有效性

儲存使用者開始執行。。。

請求完畢,列印日製記錄

可以看到,在呼叫方法前和方法後都執行相應的前置通知和後置通知的邏輯**,這樣乙個簡單的aop就實現了。

另外還有其他的通知:@around,@afterreturning,@afterthrowing

這裡簡單介紹一下,切面的執行方法和其執行順序:

@around 通知方法將目標方法封裝起來

@before 通知方法會在目標方法呼叫之前執行

@after 通知方法會在目標方法返回或者異常後執行

@afterreturning 通知方法會在目標方法返回時執行

@afterthrowing 通知方法會在目標方法丟擲異常時執行

從零搭建 Spring Boot 後端專案(一)

簡介 這一小節主要是初始化專案,以及建立好相應的目錄結構步驟 接下來新建如下的 目錄,和相關的配置檔案,目的在於規範我們的專案結構,之後的操作都將依賴此結構 層結構 資源目錄結構 靜態資源目錄 resources static 檢視模板目錄 resources templates mybatis配置...

從零搭建 Spring Boot 後端專案(六)

簡介 這一小節主要是為了,統一請求結果格式步驟 注 這裡統一的返回結果,只能保證我們沒有丟擲異常的情況,統一返回結果,但是程式丟擲異常後,返回結果將不再統一,此時我們需要全域性異常處理,再統一返回資料,下面會寫到 測試這裡可以把controller返回的資料放到resultdata類的data下返回...

SpringBoot從零開始(一)

上來先看的這篇部落格 idea新建乙個springboot mybatis mysql專案,以及遇到的問題分享。在其中第9步自動生成的過程中,出現了錯誤如下 the server time zone value is unrecognized or represents more than one ...