在 Spring Boot 中,攔截器和動態(tài)代理都是用來實現(xiàn)功能增強的,所以在很多時候,有人會認為攔截器的底層是通過動態(tài)代理實現(xiàn)的,所以本文就來盤點一下他們兩的區(qū)別,以及攔截器的底層實現(xiàn)。cZg28資訊網(wǎng)——每日最新資訊28at.com
cZg28資訊網(wǎng)——每日最新資訊28at.com
此時用戶登錄權(quán)限的驗證方法就會執(zhí)行,這就是攔截器的執(zhí)行過程。因此,可以得出結(jié)論,攔截器的實現(xiàn)主要是依賴 Servlet 或 Spring 執(zhí)行流程來進行攔截和功能增強的。cZg28資訊網(wǎng)——每日最新資訊28at.com
二、動態(tài)代理
動態(tài)代理是一種設(shè)計模式,它是指在運行時提供代理對象,來擴展目標對象的功能。在 Spring 中的,動態(tài)代理的實現(xiàn)手段有以下兩種:cZg28資訊網(wǎng)——每日最新資訊28at.com
- JDK 動態(tài)代理:通過反射機制生成代理對象,目標對象必須實現(xiàn)接口。
- CGLIB 動態(tài)代理:通過生成目標類的子類來實現(xiàn)代理,不要求目標對象實現(xiàn)接口。
動態(tài)代理的主要作用包括:cZg28資訊網(wǎng)——每日最新資訊28at.com
- 擴展目標對象的功能:如添加日志、驗證參數(shù)等。
- 控制目標對象的訪問:如進行權(quán)限控制。
- 延遲加載目標對象:在需要時才實例化目標對象。
- 遠程代理:將請求轉(zhuǎn)發(fā)到遠程的目標對象上。
三、攔截器 VS 動態(tài)代理
因此,我們可以得出結(jié)論,攔截器和動態(tài)代理雖然都是用來實現(xiàn)功能增強的,但二者完全不同,他們的主要區(qū)別體現(xiàn)在以下幾點:cZg28資訊網(wǎng)——每日最新資訊28at.com
- 使用范圍不同:攔截器通常用于 Spring MVC 中,主要用于攔截 Controller 請求。動態(tài)代理可以使用在 Bean 中,主要用于提供 bean 的代理對象,實現(xiàn)對 bean 方法的攔截。
- 實現(xiàn)原理不同:攔截器是通過 HandlerInterceptor 接口來實現(xiàn)的,主要是通過 afterCompletion、postHandle、preHandle 這三個方法在請求前后進行攔截處理。動態(tài)代理主要有 JDK 動態(tài)代理和 CGLIB 動態(tài)代理,JDK 通過反射生成代理類;CGLIB 通過生成被代理類的子類來實現(xiàn)代理。
- 加入時機不同:攔截器是在運行階段動態(tài)加入的;動態(tài)代理是在編譯期或運行期生成的代理類。
- 使用難易程度不同:攔截器相對簡單,通過實現(xiàn)接口即可使用。動態(tài)代理稍微復(fù)雜,需要了解動態(tài)代理的實現(xiàn)原理,然后通過相應(yīng)的 api 實現(xiàn)。
小結(jié)
在 Spring Boot 中,攔截器和動態(tài)代理都是用來實現(xiàn)功能增強的,但二者沒有任何關(guān)聯(lián)關(guān)系,它的區(qū)別主要體現(xiàn)在使用范圍、實現(xiàn)原理、加入時機和使用的難易程度都是不同的cZg28資訊網(wǎng)——每日最新資訊28at.com
本文鏈接:http://www.www897cc.com/showinfo-26-10448-0.htmlSpringBoot攔截器和動態(tài)代理有什么區(qū)別?
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: WPF依賴屬性介紹和用法舉例
下一篇: Go并發(fā)可視化解釋 – select語句
標簽: