天天看點

Spring Boot AOP簡單實作AOP 的概述JDK 動态代理增強一個類中方法:Cglib 動态代理增強一個類中的方法:AOP 的開發中的相關術語:Spring 切入點表達式Spring的注解的AOP的通知類型AOP具體實作兩種AOP寫法結尾

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 動态代理增強一個類中方法:

Spring Boot AOP簡單實作AOP 的概述JDK 動态代理增強一個類中方法:Cglib 動态代理增強一個類中的方法:AOP 的開發中的相關術語:Spring 切入點表達式Spring的注解的AOP的通知類型AOP具體實作兩種AOP寫法結尾

Cglib 動态代理增強一個類中的方法:

Spring Boot AOP簡單實作AOP 的概述JDK 動态代理增強一個類中方法:Cglib 動态代理增強一個類中的方法:AOP 的開發中的相關術語:Spring 切入點表達式Spring的注解的AOP的通知類型AOP具體實作兩種AOP寫法結尾

AOP 的開發中的相關術語:

Joinpoint(連接配接點):所謂連接配接點是指那些被攔截到的點。在 spring 中,這些點指 的是方法,因為 spring 隻支援方法類型的連接配接點.

Pointcut(切入點):所謂切入點是指我們要對哪些 Joinpoint 進行攔截的定義.

Advice(通知/增強):所謂通知是指攔截到 Joinpoint 之後所要做的事情就是通知.通知分為前置通知,後置通知,異常通知,最終通知,環繞通知(切面要完成的功能)

Introduction(引介):引介是一種特殊的通知在不修改類代碼的前提下,

Introduction 可以在運作期為類動态地添加一些方法或 Field.

Target(目标對象):代理的目标對象

Weaving(織入):是指把增強應用到目标對象來建立新的代理對象的過程.

spring 采用動态代理織入,而 AspectJ 采用編譯期織入和類裝在期織入

Proxy(代理):一個類被 AOP 織入增強後,就産生一個結果代理類

Aspect(切面): 是切入點和通知(引介)的結合

Spring Boot AOP簡單實作AOP 的概述JDK 動态代理增強一個類中方法:Cglib 動态代理增強一個類中的方法:AOP 的開發中的相關術語:Spring 切入點表達式Spring的注解的AOP的通知類型AOP具體實作兩種AOP寫法結尾

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>
           

目錄結構

Spring Boot AOP簡單實作AOP 的概述JDK 動态代理增強一個類中方法:Cglib 動态代理增強一個類中的方法:AOP 的開發中的相關術語:Spring 切入點表達式Spring的注解的AOP的通知類型AOP具體實作兩種AOP寫法結尾

兩種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

大家看完記得點贊呦!!!!!有什麼問題部落客會第一時間回複你們的