何爲Aop
Aop中文翻譯過來是切面編程,說通俗點就是在運行兩段代碼之間強行插入一段其他的程序。它也是Spring框架裏的一個核心功能。詳細介紹可以參考這位大佬的博客,寫的十分詳細。本篇就不再過多介紹
springboot關於aop的配置
本配置採用的maven來統一管理jar包。
首先是引入關鍵的依賴,引入相應的jar包之後,纔可以使用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
的整合
- 相當於@Before,執行切點方法開始運行前的程序
- 執行切點處的方法
- 相當於@After,執行切點方法運行結束之後的程序
運行效果圖: