Spring Boot AOP
- AOP 的概述
- JDK 動态代理增強一個類中方法:
- Cglib 動态代理增強一個類中的方法:
- AOP 的開發中的相關術語:
- Spring 切入點表達式
- Spring的注解的AOP的通知類型
- AOP具體實作
-
- pom.xml
- 目錄結構
- 兩種AOP寫法
-
- 第一種
- 第二種
- 結尾
AOP 的概述
1.1 什麼是 AOP
Spring 是解決實際開發中的一些問題: AOP 解決 OOP 中遇到的一些問題.是 OOP 的延續和擴充.
1.2 為什麼學習 AOP
對程式進行增強:不修改源碼的情況下.
AOP 可以進行權限校驗,日志記錄,性能監控,事務控制.
1.3 Spring 的 AOP 的由來:
AOP 最早由 AOP 聯盟的組織提出的,制定了一套規範.Spring 将 AOP 思想引入到架構中,必須遵守 AOP 聯盟的規範.
1.4 底層實作:
代理機制:
Spring 的 AOP 的底層用到兩種代理機制:
JDK 的動态代理 :針對實作了接口的類産生代理.
Cglib 的動态代理 :針對沒有實作接口的類産生代理. 應用的是底層的位元組碼增強的技術 生成目前類的子類對象.
1.5Spring AOP 開發方式
Spring有兩套AOP的開發方式
1.51Spring傳統方式(繁瑣,不用了)
1.5.2 Spring 基于 AspectJ的AOP開發(常用)
1.6 Spring 底層 AOP 的實作原理:(了解)
JDK 動态代理增強一個類中方法:

Cglib 動态代理增強一個類中的方法:
AOP 的開發中的相關術語:
Joinpoint(連接配接點):所謂連接配接點是指那些被攔截到的點。在 spring 中,這些點指 的是方法,因為 spring 隻支援方法類型的連接配接點.
Pointcut(切入點):所謂切入點是指我們要對哪些 Joinpoint 進行攔截的定義.
Advice(通知/增強):所謂通知是指攔截到 Joinpoint 之後所要做的事情就是通知.通知分為前置通知,後置通知,異常通知,最終通知,環繞通知(切面要完成的功能)
Introduction(引介):引介是一種特殊的通知在不修改類代碼的前提下,
Introduction 可以在運作期為類動态地添加一些方法或 Field.
Target(目标對象):代理的目标對象
Weaving(織入):是指把增強應用到目标對象來建立新的代理對象的過程.
spring 采用動态代理織入,而 AspectJ 采用編譯期織入和類裝在期織入
Proxy(代理):一個類被 AOP 織入增強後,就産生一個結果代理類
Aspect(切面): 是切入點和通知(引介)的結合
Spring 切入點表達式
execution(表達式)
文法:[方法通路修飾符] 方法傳回值 包名.類名.方法名(方法的參數)
public * cn.hwua.spring.dao..(…)
- cn.hwua.spring.dao..(…)
- cn.hwua.spring.dao.UserDao+.*(…) 目前類及其子類下的所有方法
- cn.hwua.spring.dao….(…) 目前包或子包下的所有類所有方法
Spring的注解的AOP的通知類型
@Before :前置通知
@AfterReturning :後置通知
@Around :環繞通知
@AfterThrowing :異常抛出通知
@After :最終通知
AOP具體實作
pom.xml
在此之前需要擁有一個Spring boot項目:https://blog.csdn.net/d528071941/article/details/106408594
<!-- aop依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
目錄結構
兩種AOP寫法
這兩個類通用的:
@Component
public class AopDao {
public void getBefore(){
System.out.println("我操作資料庫:");
}
@AopNote
public void getBeforeTWO(){
System.out.println("我是巨無霸:");
}
}
@Controller
public class AopController {
@Autowired
AopDao aopDao;
@RequestMapping("/aop")
@ResponseBody
String aopDemo() {
System.out.println("=========================");
aopDao.getBefore();
return "success";
}
@RequestMapping("/aopNote")
@ResponseBody
String aopNoteDemo() {
System.out.println("=========================");
aopDao.getBeforeTWO();
return "success";
}
}
第一種
@Aspect
@Component
public class AopDemo {
@Before(value = "execution(* study.startspringboot.aop.AopDao.getBefore())")
public void getDemo(){
System.out.println("使用者要操作資料庫了-----------------");
}
}
第二種
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AopNote {
String value() default "";
}
@Aspect
@Component
public class AopNoteDemo {
@Before(value ="@annotation(study.startspringboot.aop.AopNote)")
public void getDemo(){
System.out.println("我是注解開發AOP-----------------");
}
}
結尾
部落客用的Spring boot是2.3.0版本的,但是2.3.0貌似沒有AOP這和相容的包,推薦使用2.1.0可以完美運作上面的代碼
順便代碼也傳到IGit上:https://github.com/aloneoneself/springStudy
大家看完記得點贊呦!!!!!有什麼問題部落客會第一時間回複你們的