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>

目錄結構

ss

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

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