aop阻止方法執行 Aop實現攔截方法引數

2021-10-13 08:12:56 字數 2246 閱讀 2864

對於spring框架來說,最重要的兩大特性就是aop 和ioc。

以前一直都知道有這兩個東西,在平時做的專案中也常常會涉及到這兩塊,像spring的事務管理什麼的,在看了些原始碼後,才知道原來事務管理也是用的aop來實現的。對於ioc的話,平時接觸的就更多了,什麼autowired,resource各種註解,就是ioc的各種應用。

一直我也想著能有機會自己動手寫個aop的小demo,不過一直沒機會,想到了許多,在網上一搜,基本上都已經有了。今天想到乙個用於對service方法進行攔截的功能點,今天決定用springboot的工程來實現一下。

功能點描述:對某個service的方法執行前,獲取出入參,對入參的引數進行修改,將引數進行替換。然後在這個方法執行完畢後,再對其返回結果進行修改。主要就是對乙個方法裝飾一下。說到裝飾,第一想到的是採用裝飾器模式來實現,但裝飾器模式需要對整個**的結構進行一些修改,為了達到對以前的**不進行任何接觸,且裝飾器模式的侷限性較小,所以最好還是用spring的aop來實現這種對**無任何侵入的功能。

service的**如下:

@service

public class testserviceimpl implements testservice ", paramvo);

resultvo resultvo = new resultvo();

resultvo.setcode(200);

resultvo.setdata(arrays.aslist("123", "456", "789"));

resultvo.setmessage("ok!!!!!!!! and your inputparam is" + paramvo.tostring());

logger.info("---->return info:{}", resultvo.tostring());

return resultvo;

其中入參為paramvo,**如下:

public class paramvo catch (invocationtargetexception e) finally catch (throwable throwable) catch (throwable throwable) {

throwable.printstacktrace();

return null;

* 處理返回物件

private void processoutputobj(object obj) {

system.out.println("obj 原本為:" + obj.tostring());

if (obj instanceof resultvo) {

resultvo resultvo = (resultvo) obj;

resultvo.setmessage("哈哈,我把值修改了" + resultvo.getmessage());

system.out.println(resultvo);

* 處理輸入引數

* @param args 入參列表

private void processinputarg(object args) {

for (object arg : args) {

system.out.println("arg原來為:" + arg);

if (arg instanceof paramvo) {

paramvo paramvo = (paramvo) arg;

paramvo.setinputparam("654321");

如不進行@before和@afterreturing的注釋,最終的結果如下:

控制台列印的日誌為:

通過檢視列印的結果,我們可以知道@around @before  @after  @afterreturning這幾個註解的執行順序為:

around

aroundbefore

before

method.invoke()

aroundafter

after

afterreturning

監控某一方法的書寫規則為:

expgetresultdatapoint = "execution(* com.dahuatech.thenext.beans.jerseyclient.call(..))"

其中call是jerseyclient類中的乙個方法。

@after(expgetresultdatapoint)

public void deafter(joinpoint joinpoint){

do business

spring的AOP 基於XML實現AOP的過程

參考對應的 logaspect bean 或者 logaspect 類。logaspect類如下 package org.zttc.itat.spring.proxy import org.aspectj.lang.joinpoint import org.aspectj.lang.proceedi...

註解實現AOP

使用註解實現aop,注意版本問題,使用註解報錯要匯入m en依賴 dependency groupid j ax.annotation groupid artifactid j ax.annotation api artifactid version 1.3.2 version dependency...

AOP執行過程解析

上篇寫了動態 這裡我們來看看aop吧 aop面向切面程式設計的核心思想就是動態 想要應用aop,主要有如下步驟 1 編寫乙個切面類,在類中寫一些方法,在些方法上配置連線點 before after around afterruturning afterthrowing 在連線點後寫明切點 excec...