首先在spring的xml檔案中完成相應的配置:
在持久化類中加上註解,方便使用id呼叫
注意這裡設定了乙個異常 1/0的異常
日誌類的**如下:
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.component;
/** * 用於記錄日誌的工具類,它裡面提供了公共的**
*/@component("logger")
@aspect//表示當前類是乙個切面類
public class logger
//前置通知
@before("execution(* com.itheima.service.impl.*.*(..))")
public void beforeprintlog()
/*** 後置通知
*/@afterreturning("execution(* com.itheima.service.impl.*.*(..))")
public void afterreturningprintlog()
/*** 異常通知
*/@afterthrowing("execution(* com.itheima.service.impl.*.*(..))")
public void afterthrowingprintlog()
/*** 最終通知
*/@after("execution(* com.itheima.service.impl.*.*(..))")
public void afterprintlog()
/*** 環繞通知
* 問題:
* 當我們配置了環繞通知之後,切入點方法沒有執行,而通知方法執行了。
* 分析:
* 通過對比動態**中的環繞通知**,發現動態**的環繞通知有明確的切入點方法呼叫,而我們的**中沒有。
* 解決:
* spring框架為我們提供了乙個介面:proceedingjoinpoint。該介面有乙個方法proceed(),此方法就相當於明確呼叫切入點方法。
* 該介面可以作為環繞通知的方法引數,在程式執行時,spring框架會為我們提供該介面的實現類供我們使用。
** spring中的環繞通知:
* 它是spring框架為我們提供的一種可以在**中手動控制增強方法何時執行的方式。
如上圖所示:需要註明類的名稱以及切面類的的表示。同時在,每個環繞方法中設定切入點的表示式
執行結果如上圖所示。顯然成功了
**如下:
import org.aspectj.lang.proceedingjoinpoint;
import org.aspectj.lang.annotation.around;
import org.aspectj.lang.annotation.aspect;
import org.aspectj.lang.annotation.pointcut;
import org.springframework.stereotype.component;
/** * 用於記錄日誌的工具類,它裡面提供了公共的**
*/@component("logger")
@aspect//表示當前類是乙個切面類
public class logger catch (throwable t)finally }}
view code
其他的一律不變
基於註解的AOP配置
before 前置通知 afterreturning 後置通知 after 最終通知 afterthrowing 異常通知 around 環繞通知 pointcut 指定切入點表示式 使用方法 pointcut execution cn.itcast.service.impl.private voi...
Spring基於註解AOP配置
一 spring基於註解aop配置 1.假設建立乙個accountservice需要增強 執行其中每乙個方法都會加乙個記錄日誌的方法 則再建立乙個日誌類實現記錄日誌方法 將該類注入spring容器 component logger aspect 表示當前類是乙個切面類 public class lo...
基於註解的AOP
aop是oop的延續,是aspect oriented programming的縮寫,意思是面向切面程式設計。可以通過預編譯方式和執行期動態 實現在不修改源 的情況下給程式動態統一新增功能的一種技術。aop實際是gof設計模式的延續,設計模式孜孜不倦追求的是呼叫者和被呼叫者之間的解耦,aop可以說也...