Spring使用 AOP 實現 日誌功能

2021-09-22 22:54:16 字數 4780 閱讀 7080

乙個簡單版本。

在寫aop 實現日誌功能時,如果你對aop 一些內建屬性不清楚的,可結合此部落格:

**環境 ssm :

@entity

@table(name = "logtable")

@setter

@getter

public class logtable

@target()

@retention(retentionpolicy.runtime)

@documented

public @inte***ce log

引數解釋:

/**

* @author cc

* * @target()

* 作用:用於描述註解的使用範圍(即:被描述的註解可以用在什麼地方)

* *   取值(elementtype)有:

* *     1.constructor:用於描述構造器

*     2.field:用於描述域

*     3.local_variable:用於描述區域性變數

*     4.method:用於描述方法

*     5.package:用於描述包

*     6.parameter:用於描述引數

*     7.type:用於描述類、介面(包括註解型別) 或enum宣告

* * @retention(retentionpolicy.runtime) 解釋:@retention() 定義了該annotation(注釋)被保留的時間長短

* 取值(retentionpoicy)有:

* *     1.source:在原始檔中有效(即原始檔保留)

*     2.class:在class檔案中有效(即class保留)

*     3.runtime:在執行時有效(即執行時保留)

* ** 自定義註解: @inte***ce 自定義註解

* *  定義註解格式:

*   public @inte***ce 註解名

* *   註解引數的可支援資料型別:

* *     1.所有基本資料型別(int,float,boolean,byte,double,char,long,short)

*     2.string型別

*     3.class型別

*     4.enum型別

*     5.annotation型別

*     6.以上所有型別的陣列

* *   annotation(注釋)型別裡面的引數該怎麼設定:

*   第一,只能用public或缺省(default)這兩個訪問權修飾.例如,string value();這裡把方法設為defaul預設型別;   

*   第二,引數成員只能用基本型別byte,short,char,int,long,float,double,boolean八種基本資料型別和 string,enum,class,annotations等資料型別,以及這一些型別的陣列.例如,string value();這裡的引數成員就為string;  

*   第三,如果只有乙個引數成員,最好把引數名稱設為"value",後加小括號.例:下面的例子fruitname註解就只有乙個引數成員。

* * @data 2019/5/18 13:53

*/

/**

* @author cc

* @data 2019/4/23 16:59

*///定義切面

@aspect

@component

public class logaopaspect catch (classnotfoundexception e)

method methods = aclass.getmethods();

for (int i = 0; i < methods.length; i++)

class<?> clazzs = methods[i].getparametertypes();

if (clazzs.length == args.length)

}system.out.println("署名資訊的物件:"+signature);

system.out.println("目標方法所屬類的簡單類名:"+******name);

system.out.println("獲取傳入目標方法的引數物件:"+target);

system.out.println("**類:"+targetname);

system.out.println("方法名:"+methodname);

system.out.println("操作型別:"+operationtype);

system.out.println("操作解釋:"+operateexplain);

system.out.println("---------------------------開始儲存日誌----------------------------------");

******dateformat dateformat = new ******dateformat("yyyy-hh-dd hh:mm:ss");

string date = dateformat.format(new date());

logtable logtable1 = new logtable();

logtable1.setoperateclassname(targetname); //方法所在類名

logtable1.setoperatemethodname(methodname); //執行的方法

logtable1.setoperatetype(operationtype); //操作型別

logtable1.setoperateexplain(operateexplain); //操作說明

logtable1.setoperateuser("超級管理員"); //操作人

logtable1.setoperatedate(date); //執行的時間

logtable1.setoperateresult("");

logtable1.setremark("");

logtabledao.addlog(logtable1);

}catch (exception e)

} //異常通知

@afterthrowing(value = "execution( * cn.sys.controller.rwdaocontroller.delrwhist(..))",throwing = "e")

public void exceptionadvice(joinpoint joinpoint,throwable e)

system.out.println(params);

try catch (classnotfoundexception ee)

method methods = clazz.getmethods();

for (int i = 0; i < methods.length; i++)

class<?> parametertypes = methods[i].getparametertypes();

if (parametertypes.length == args.length)

}system.out.println("---------------------------開始儲存日誌----------------------------------");

******dateformat dateformat = new ******dateformat("yyyy-hh-dd hh:mm:ss");

string date = dateformat.format(new date());

logtable logtable1 = new logtable();

logtable1.setoperateclassname(targetname); //方法所在類名

logtable1.setoperatemethodname(methodname); //執行的方法

logtable1.setoperatetype(operationtype); //操作型別

logtable1.setoperateexplain(operateexplain); //操作說明

logtable1.setoperateuser("超級管理員"); //操作人

logtable1.setoperatedate(date); //執行的時間

logtable1.setoperateresult("刪除失敗,異常**"+e.getclass().getname() +"異常資訊:"+e.getmessage());

logtable1.setremark("");

logtabledao.addlog(logtable1);

}catch (exception ee)

}}

controller

public class rwdaocontroller catch (exception e)

return jsonobject.tojsonstring("刪除成功");

}}

注:

1.如果切入點的方法出現異常了,則不會走 環繞方法。

2.到此完成。

spring 註解實現aop

aspect表明這是乙個切面類 package com.kuang.diy author administrator description todo date 2021 11 26 13 46 import org.aspectj.lang.proceedingjoinpoint import o...

使用spring註解方式實現AOP 二

如果需要對業務方法中的引數和返回值做處理的情況下 package com.chris.aop import org.springframework.stereotype.service service testservice public class testservicebean public s...

spring 基於AOP模擬日誌列印

一 控制方法執行列印日誌 執行後列印日誌 讓指定方法列印日誌 1.指定方法列印日誌 1 在invoke 方法中加乙個對method名字的判斷,其中method的名字可以寫在xml檔案中。二 實現 1.ilogger public inte ce iloggerpublic class dlogger...