初步學習Spring Aop使用之配置方式
前言:
初步學習接觸Spring框架使用,而在這裡對自己剛學的Aop使用做個小篇幅的總結,方便日後需要用到是可以快速入手!
僅用於對自己學習個人筆記,不做任意分享,純屬個人理解不想誤認子弟!
一、Aop知識點理解
AOP稱為面向切面程式設計,在程式開發中主要用來解決一些系統層面上的問題,比如日誌,事務,許可權等待
(1)Aspect(切面):通常是一個類,裡面可以定義切入點和通知
(2)JointPoint(連線點):程式執行過程中明確的點,一般是方法的呼叫
(3)Advice(通知):AOP在特定的切入點上執行的增強處理,有before,after,afterReturning,afterThrowing,around
(4)Pointcut(切入點):就是帶有通知的連線點,在程式中主要體現為書寫切入點表示式
二、示例如下
專案目錄,基於SpringBoot專案【主要檔案為如下4個標記檔案】
AspectClass.java 【切面檔案,用於編寫一些用於給某些需要修飾方法額外嵌入的程式碼】
package aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; /** * @author Luck * Aop 插入示例 */ public class AspectClass {
// 在處理業務邏輯前先執行 public void start() { System.out.println("前面插入方法"); } // 在處理完業務邏輯後執行 public void end() { System.out.println("後面插入方法"); } // 環繞執行,可通過條件來判斷是否要處理執行該業務邏輯 public void around(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("環繞插入前。。。。。。。。。。"); joinPoint.proceed(); System.out.println("環繞插入後。。。。。。。。。。"); } }
AopServer.java 【業務邏輯處理類,簡單輸出一個標記】
package aop;
import org.springframework.stereotype.Service;
@Service
public class AopServer { public void add() { System.out.println("舊版本新增業務處理"); } }
Main.java 【測試入口檔案】
package aop;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args) {
// 載入配置檔案 ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
// 通過context物件獲取業務物件 AopServer server = (AopServer) context.getBean(AopServer.class);
// 呼叫需要修飾的方法 server.add(); } }
application.xml 【配置檔案,配置哪個介面需要修飾及在那個位置修飾】
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd"> <!-- 掃描器:告知Spring容器那些檔案是Bean --> <context:component-scan base-package="aop" /> <!-- 配置切面Bean --> <bean id="aspect" class="aop.AspectClass"></bean> <aop:config> <aop:pointcut expression="execution(* aop.AopServer.add(..))" id="point" /> <aop:aspect ref="aspect">
<!-- 前置配置 --> <aop:before method="start" pointcut-ref="point" />
<!-- 後置配置 --> <aop:after method="end" pointcut-ref="point" />
<!-- 環繞配置 -->
<aop:around method="around" pointcut-ref="point"/> </aop:aspect> </aop:config> </beans>
執行順序應該是先環繞-前置-後置,執行結果:
三、配置使用
配置aop的切入點
<aop:pointcut expression="execution(* aop.AopServer.add(..))" id="point" />
id 是切入點的標識
expression 為切入點的表示式
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)
throws-pattern?)
modifiers-pattern 修飾符 可選 public private protected
ret-type-pattern 返回型別 必選 * 代表任意型別
declaring-type-pattern 方法的宣告型別
name-patterm 方法名稱型別
set* 以set開頭的所有的方法名稱
update* 以update開頭的所有的方法名稱
param-pattern 引數匹配
(..) 任意多個引數,每個引數任意多個型別
(*,String) 兩個引數 第一個是任意型別,第二個是String
(String,*,Integer) 三個引數,第一個是String型別,第二個是任意型別,第三個是Integer型別
throws-pattern 異常的匹配模式
例子:
execution(* aop.AopServer.*(..));
aop.AopServer下的所有的方法
execution(public * aop..*.*(..))
返回值為任意型別,修飾符為public,在aop包及子包下的所有的類的所有的方法
exectuion(* aop..*.update*(*,String))
返回值是任意型別,在aop包及子包下所有的以update開頭的引數為兩個,第一個為任意型別
第二個為String型別的所有類的所有的方法
execution(* dao.service..*.*(..))
第一個*表示匹配任意的方法返回值,..(兩個點)表示零個或多個,上面的第一個..表示service包及其子包,第二個*表示所有類,第三個*表示所有方法,第二個..表示方法的任意引數個數