Spring Boot 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
大家看完記得點贊呦!!!!!有什麼問題博主會第一時間回覆你們的