最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring AOP詳解面向切面編程思想

 更新時間:2022年06月20日 09:24:14   作者:獨一無二的哈密瓜  
Spring是一個廣泛應(yīng)用的框架,SpringAOP則是Spring提供的一個標準易用的aop框架,依托Spring的IOC容器,提供了極強的AOP擴展增強能力,對項目開發(fā)提供了極大地便利

1. 什么是 Spring AOP

AOP (Aspect Oriented Programming): 面向切面編程, 它是一種思想, 它是對某一類事情的集中處理.

例如, 在沒有學習AOP之前, 之前的判斷當前登錄狀態(tài), 就需要在每一個頁面都實現(xiàn)登錄校驗, 在有了AOP之后, 外面只需在某一處配置以下, 所有的頁面就都可以實現(xiàn)登錄驗證了, 就不需要寫太多重復的代碼,

Spring AOP, 是一個框架, 提高了一種對 AOP 思想的實現(xiàn).

2. AOP 的組成

2.1 切面 (Aspect)

切面由切點和通知組成, 它既包含了橫切邏輯的定義, 也包括了連接點的定義.

切面是包含了: 通知, 切點和切面的類, 相當于 AOP 實現(xiàn)的某個功能的集合

2.2 切點 (Pointcur)

切點的作用就是提供一組規(guī)則 (使用 AspectJ pointcut expression language 來描述) 來匹配 連接點, 給滿足規(guī)則的 連接點添加 Advice

切點相當于保存了眾多連接點的一個集合

2.3 連接點 (Join Point)

應(yīng)用執(zhí)行過程中能夠插入切面的一個點, 這個點可以是方法的調(diào)用時, 拋出異常時, 甚至修改字段時. 切面代碼可以利用這些點插入到應(yīng)用的正常流程之中, 并添加新的行為.

連接點相當于需要被增強的某個 AOP 功能的所有方法.

2.4 通知 (Advice)

定義了切面是什么, 何時使用, 其描述切面要完成的工作, 還解決何時執(zhí)行這個工作的問題,

Spring切面類中, 可以在方法上使用以下注解, 會設(shè)置方法為通知方法, 在滿足條件后會通知本方法進行調(diào)用.

?法進?調(diào)用:

前置通知使用 @Before:通知方法會在目標方法調(diào)用之前執(zhí)行.

后置通知使用 @After:通知方法會在目標方法返回或者拋出異常后調(diào)用.

返回之后通知使用 @AfterReturning:通知方法會在目標方法返回后調(diào)用.

拋異常后通知使用 @AfterThrowing:通知方法會在目標方法拋出異常后調(diào)用.

環(huán)繞通知使用 @Around:通知包裹了被通知的方法, 在被通知的方法通知之前和調(diào)用之后執(zhí)行自定義的行為.

3. Spring AOP 的使用

3.1 添加 AOP 框架

在 pom.xml 中添加依賴

<!-- https://mvnrepository.com/artifact/org.springframework.boot/springboot-starter-aop -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-aop</artifactId>
		</dependency>

3.2 定義切面和切點

@Aspect // 定義切面
@Component
public class UserAspect {
    // 切點 (配置攔截規(guī)則)
    @Pointcut("execution(* com.example.demo.controller.UserController.*)")
    public void pointcut() {
        // 這是一個空方法, 不需要有具體的實現(xiàn)
    }
}

切點表達式注意事項

AspectJ 支持三種通配符

  • * : 匹配任意字符, 只匹配一個元素 (包, 類, 方法, 方法參數(shù))
  • .. : 匹配任意字符,可以匹配多個元素, 在標識類時, 必須聯(lián)合 * 使用
  • + : 表示按類型匹配指定類和所有類, 必須跟在類名后面, 如 com.cad.Car+, 表示繼承該類的所有子類包括本身

execution() 是最常用的切點函數(shù)

語法為: execution(<修飾符> <返回類型> <包.類.方法(參數(shù))> <異常>) (注意: 修飾符和異??梢允÷?

示例:

  • execution(* com.cad.demo.User.*(..)) :匹配 User 類?的所有?法。
  • execution(* com.cad.demo.User+.*(..)) :匹配該類的?類包括該類的所有?法。
  • execution(* com.cad.*.*(..)) :匹配 com.cad 包下的所有類的所有?法。
  • execution(* com.cad..*.*(..)) :匹配 com.cad 包下、?孫包下所有類的所有?法。
  • execution(* addUser(String, int)) :匹配 addUser ?法,且第?個參數(shù)類型是 String,第?個參數(shù)類型是 int。

3.3 定義通知 (五種)

@Aspect // 定義切面
@Component
public class UserAspect {
    // 切點 (配置攔截規(guī)則)
    @Pointcut("execution(* com.example.demo.controller.UserController.*(..))")
    public void pointcut() {
        // 這是一個空方法, 不需要有具體的實現(xiàn)
    }
    @Before("pointcut()")
    public void doBefore(){
        System.out.println("執(zhí)行 Before 方法");
    }
    @After("pointcut()")
    public void doAfter(){
        System.out.println("執(zhí)行 After 方法");
    }
    @AfterReturning("pointcut()")
    public void doAfterReturning() {
        System.out.println("執(zhí)行 AfterReturning 方法");
    }
    @AfterThrowing("pointcut()")
    public void doAfterThrowing() {
        System.out.println("執(zhí)行 AfterThrowing 方法");
    }
    @Around("pointcut()")
    public Object doAround(ProceedingJoinPoint joinPoint) {
        Object object = null;
        System.out.println("Around 方法開始執(zhí)行");
        try {
            // 執(zhí)行攔截方法
            object = joinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        System.out.println("Around 方法結(jié)束執(zhí)行");
        return object;
    }
}

正常時

拋出異常時

4. Spring AOP 實現(xiàn)原理

Spring AOP 是構(gòu)建在動態(tài)代理基礎(chǔ)上, 因此 Spring 對 AOP 的支持局限于方法級別的攔截.

Spring AOP 是基于動態(tài)代理實現(xiàn)的.

動態(tài)代理分為兩類:

  • JDK Proxy(JDK 動態(tài)代理機制)
  • CGLIB 動態(tài)代理

默認情況下, 實現(xiàn)了接口的類, 使用 AOP 會基于 JDK 生成代理類, 沒有實現(xiàn)接口的類, 會基于 CGLIB 生成代理類

4.1 織入 (Weaving)

代理的生成時機

織?是把切面應(yīng)用到目標對象并創(chuàng)建新的代理對象的過程,切面在指定的連接點被織?到目標對象中。

在目標對象的?命周期里有多個點可以進?織入:

  • 編譯期:切面在目標類編譯時被織?。這種?式需要特殊的編譯器。AspectJ的織?編譯器就是以這種方式織入切?的。
  • 類加載器:切?在目標類加載到JVM時被織入。這種方式需要特殊的類加載器(ClassLoader),它可以在目標類被引入應(yīng)用之前增強該目標類的字節(jié)碼。AspectJ5的加載時織入(load-time weaving. LTW)就支持以這種方式織入切面。
  • 運行期:切面在應(yīng)用運行的某?時刻被織入。?般情況下,在織入切面時,AOP容器會為目標對象動態(tài)創(chuàng)建一個代理對象. Spring AOP 就是以這種方式織入切面的

4.2 JDK 和 CGLIB 實現(xiàn)的區(qū)別

  • JDK 實現(xiàn)要求被代理類必須實現(xiàn)接口, 之后是通過 InvocationHandlerProxy, 在運行時動態(tài)的在內(nèi)存中生成了代理類對象, 該代理對象是通過實現(xiàn)同樣的接口實現(xiàn) (類似靜態(tài)代理接口實現(xiàn)的方式), 只是該代理類是在運行期時,動態(tài)的織入統(tǒng)一的業(yè)務(wù)邏輯字節(jié)碼來完成.
  • CGLIB 實現(xiàn), 被代理類可以不實現(xiàn)接口, 是通過繼承被代理類, 在運行時動態(tài)的生成代理類對象.

到此這篇關(guān)于Spring AOP詳解面向切面編程思想的文章就介紹到這了,更多相關(guān)Spring AOP切面編程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java網(wǎng)上圖書商城(4)購物車模塊1

    java網(wǎng)上圖書商城(4)購物車模塊1

    這篇文章主要為大家詳細介紹了java網(wǎng)上圖書商城,購物車模塊,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Java圖片處理之獲取gif圖一幀圖片的兩種方法

    Java圖片處理之獲取gif圖一幀圖片的兩種方法

    這篇文章主要給大家介紹了關(guān)于Java圖片處理之獲取gif圖一幀圖片的兩種方法,分別是利用Java原生代碼和使用im4java調(diào)用ImageMagick來實現(xiàn),兩種方法都給出來示例代碼供大家參考學習,需要的朋友們下面來一起看看吧。
    2017-10-10
  • 詳解java封裝繼承多態(tài)

    詳解java封裝繼承多態(tài)

    這篇文章主要介紹了java封裝繼承多態(tài),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • Spring中Bean的命名方式代碼詳解

    Spring中Bean的命名方式代碼詳解

    這篇文章主要介紹了Spring中Bean的命名方式代碼詳解,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Spring?Data?Redis切換底層Jedis和Lettuce實現(xiàn)源碼解析

    Spring?Data?Redis切換底層Jedis和Lettuce實現(xiàn)源碼解析

    這篇文章主要為大家介紹了Spring?Data?Redis切換底層Jedis和Lettuce實現(xiàn)方法源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • SpringCache源碼解析Annotation案例講解

    SpringCache源碼解析Annotation案例講解

    這篇文章主要介紹了SpringCache源碼解析Annotation的相關(guān)知識,本文通過案例講解的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • Java AES加密和解密教程

    Java AES加密和解密教程

    這篇文章主要介紹了Java AES加密和解密的相關(guān)資料,幫助大家更好的理解和學習Java,感興趣的朋友可以了解下
    2020-12-12
  • java中阻塞隊列和非阻塞隊列的實現(xiàn)

    java中阻塞隊列和非阻塞隊列的實現(xiàn)

    在Java并發(fā)編程中,阻塞隊列和非阻塞隊列是兩種主要的隊列類型,分別適用于不同的場景,了解這兩種隊列的特點和工作機制,可以幫助開發(fā)者更好地選擇合適的數(shù)據(jù)結(jié)構(gòu)解決并發(fā)問題
    2024-10-10
  • Java 實戰(zhàn)項目錘煉之嘟嘟健身房管理系統(tǒng)的實現(xiàn)流程

    Java 實戰(zhàn)項目錘煉之嘟嘟健身房管理系統(tǒng)的實現(xiàn)流程

    讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實現(xiàn)一個健身房管理系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2021-11-11
  • SpringBoot整合RabbitMQ及生產(chǎn)全場景高級特性實戰(zhàn)

    SpringBoot整合RabbitMQ及生產(chǎn)全場景高級特性實戰(zhàn)

    本文主要介紹了SpringBoot整合RabbitMQ及生產(chǎn)全場景高級特性實戰(zhàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10

最新評論

缙云县| 含山县| 五河县| 会宁县| 溧阳市| 广昌县| 怀化市| 无为县| 乌拉特后旗| 弥勒县| 阿坝| 延安市| 田阳县| 桑植县| 建德市| 东乌珠穆沁旗| 邵武市| 葵青区| 来宾市| 鄂托克旗| 永昌县| 乐陵市| 故城县| 揭西县| 兴和县| 城口县| 克什克腾旗| 石屏县| 沈阳市| 剑河县| 望都县| 濮阳市| 博乐市| 全州县| 车险| 郧西县| 化隆| 樟树市| 同德县| 绥滨县| 广德县|