1. 程式人生 > >初步學習Spring Aop使用之配置方式

初步學習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包及其子包,第二個*表示所有類,第三個*表示所有方法,第二個..表示方法的任意引數個數