Springboot與Aop

何爲Aop

Aop中文翻譯過來是切面編程,說通俗點就是在運行兩段代碼之間強行插入一段其他的程序。它也是Spring框架裏的一個核心功能。詳細介紹可以參考這位大佬的博客,寫的十分詳細。本篇就不再過多介紹

springboot關於aop的配置

本配置採用的maven來統一管理jar包。
首先是引入關鍵的依賴,引入相應的jar包之後,纔可以使用aop的註解
aop關鍵註解
附上代碼

 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

aop的用法

aop是spring框架的幾大核心功能之一,之前我們在使用ssm整合框架的時候,雖然aop已經有自己的註解,但我們大部分還是用的xml配置。springboot提倡使用註解,所以我這次主要還是講的aop的基本註解用法。
這裏寫圖片描述
聲明一個類,我們可以把這個類理解爲配置類,並添上@Aspect@Component註解。若沒有出現這個註解,很可能是因爲maven中的依賴沒有起作用,嘗試着在網好的地方刷新一下試試?
聲明完類之後,我們要往裏面添加東西了。首先是聲明切點
@Pointcut註解的作用是聲明一個切點。其基本語法爲 :
這裏寫圖片描述

@Pointcut(value = "execution(切點地址)")//注意:雙引號要保留
public void 切點代名{}

其中,切點地址是有一定格式規範的,詳細情況可以參考spring官方文檔,地址爲spring官方文檔
在導航欄裏選中該項,然後向下滑動大概3,4秒左右就能找到
這裏寫圖片描述
這裏寫圖片描述

我下面就介紹一些比較常用的寫法
項目結構圖爲:
這裏寫圖片描述

AopTest類

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
 * @author 無_言
 * aop第一個測試類
 * */

@Controller
@RequestMapping("aopTest")
public class AopTest {

    @RequestMapping("/start1")
    public String start1(){
        System.out.println("start1方法");
        return "hello";
    }

    @RequestMapping("/start2")
    public String start2(){
        System.out.println("start2方法");
        return "hello";
    }
}

AopTest2類

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author 無_言
 * aop第二個測試類
 * */

@Controller
@RequestMapping("/aopTest2")
public class AopTest2 {

    @RequestMapping("/start4")
    public String start4(){
        System.out.println("start4方法");
        return "hello";
    }

    @RequestMapping("/disstart4")
    public String disstart4(String str){
        System.out.println("disstart4方法");
        return "hello";
    }

    @RequestMapping("/disstart5")
    public String disstart5(){
        System.out.println("disstart5方法");
        return "hello";
    }
}

切點聲明:

    @Pointcut(value = "execution(* my.test.aoptest.controller..*.*(..))")
    public void pointCutAll(){}

    @Pointcut(value = "execution(* my.test.aoptest.controller.AopTest.*(..))")
    public void pointCut1(){}

    @Pointcut(value = "execution(* my.test.aoptest.controller.AopTest.start1())")
    public void pointCut2(){}

    @Pointcut(value = "execution(* my.test.aoptest.controller.AopTest.start2())")
    public void pointCut3(){}

    @Pointcut(value = "execution(* my.test.aoptest.controller.AopTest2.dis*(..))")
    public void pointCut4(){}

    @Pointcut(value = "execution(* my.test.aoptest.controller.AopTest2.dis*(String))")
    public void pointCut5(){}

附上圖:
這裏寫圖片描述

首先,括號裏的第一個星號代表權限(下同),除了號以外,就是private,public ,protected,default四個基本權限。代表訪問該包中擁有這些權限的屬性。例如把號換成public則程序就只會掃描權限爲public的方法,換成private同理,*號表通配符,意思爲所有權限的方法都可以訪問。
1. 表示controller包下的所有類的所有權限和類型的方法
2. 表示controller包下名爲AopTest的類下的所有類型和權限的方法
3. 表示controller包下名爲AopTest的類下的名爲star1的方法
4. 表示controller包下名爲AopTest的類下的名爲star2的方法
5. 表示controller包下名爲AopTest2的類下的所有名稱以“dis”開頭的方法
6. 表示controller包下名爲AopTest2的類下的所有名稱以“dis”開頭的參數類型爲String的方法

再聲明完切點之後,接下來就是聲明切面方法了。這裏着重介紹三個註解@Before,@After和@Around

這裏寫圖片描述

附上代碼:

    @Before("pointCut2()")
    public void testAop2(){
        System.out.println("這是程序執行前的函數");
    }

    @After("pointCut3()")
    public void testAop1(){
        System.out.println("這是程序執行之後的函數");
    }

    @Around("pointCut4()")
    public Object testAop6(ProceedingJoinPoint pro)throws Throwable{
        System.out.println("程序執行之前的函數");
        Object proccees=pro.proceed();//切點方法執行
        System.out.println("程序執行結束後的函數");
        return proccees;
    }

這三個註解的格式都是@註解名(”切點地址”)(注:1.雙引號保留2.如果在上文聲明瞭切點,則可直接使用切點代名)
這裏寫圖片描述

其中,@Before和@After見名知義,分別指代方法開始運行之前和運行結束之後所要執行的程序。程序運行結果如下:

@Before

這裏寫圖片描述

@After

這裏寫圖片描述

相對於前面兩個註解,@Around要稍微複雜一些,不過可以把@Around理解爲@Before@After的整合

這裏寫圖片描述

  1. 相當於@Before,執行切點方法開始運行前的程序
  2. 執行切點處的方法
  3. 相當於@After,執行切點方法運行結束之後的程序

運行效果圖:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章