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

Springboot項(xiàng)目Aop與攔截器與過濾器橫向?qū)Ρ?/h1>
 更新時(shí)間:2023年03月28日 09:40:33   作者:凡夫販夫  
前三篇文章已經(jīng)介紹過Springboot項(xiàng)目如何實(shí)現(xiàn)Aop,攔截器和過濾齊功能,這篇文章主要介紹三者的橫向?qū)Ρ?,本文有一定的參考價(jià)值,感興趣的小伙伴可以參考閱讀

前言

偉人曾經(jīng)說過,沒有調(diào)查就沒有發(fā)言權(quán)(好像是偉人說的,不管誰說的,這句話是正確的),有些東西看著簡單,張口就來,但很有可能是錯(cuò)的。我個(gè)人的經(jīng)驗(yàn)是,aop、過濾器、攔截器的實(shí)現(xiàn)方式很簡單,一學(xué)就會(huì),不用就忘,忘了再學(xué),學(xué)了再忘,如此循環(huán)內(nèi)耗何必呢?因此,如果你和我一樣,有一顆強(qiáng)烈的好奇之心,那么不管多簡單,動(dòng)手敲起來吧,溫故而知新呢。

功能特性對比

過濾器

過濾器(Filter)是與servlet相關(guān)聯(lián)的一個(gè)接口,主要適用于java web項(xiàng)目中,依賴于Servlet容器,是利用java的回調(diào)機(jī)制來實(shí)現(xiàn)過濾攔截來自瀏覽器端的http請求,可以攔截到訪問URL對應(yīng)的方法的請求和響應(yīng)(ServletRequest request, ServletResponse response),但是不能對請求和響應(yīng)信息中的值進(jìn)行修改;一般用于設(shè)置字符編碼、鑒權(quán)操作等;如果想要做到更細(xì)一點(diǎn)的類和方法或者是在非servlet環(huán)境中使用,則是做不到的;所以凡是依賴Servlet容器的環(huán)境,過濾器都可以使用,如Struts2、SpringMVC;

攔截器

攔截器的(HandlerInterceptor)使用范圍以及功能和過濾器很類似,但是也是有區(qū)別的。首先,攔截器(HandlerInterceptor)適用于SpringMVC中,因?yàn)镠andlerInterceptor接口是SpringMVC相關(guān)的一個(gè)接口,而實(shí)現(xiàn)java Web項(xiàng)目,SpringMVC是目前的首選選項(xiàng),但不是唯一選項(xiàng),還有struts2等;因此,如果是非SpingMVC的項(xiàng)目,HandlerInterceptor無法使用的;其次,和過濾器一樣,攔截器可以攔截到訪問URL對應(yīng)的方法的請求和響應(yīng)(ServletRequest request, ServletResponse response),但是不能對請求和響應(yīng)信息中的值進(jìn)行修改;一般用于設(shè)置字符編碼、鑒權(quán)操作等;如果想要做到更細(xì)一點(diǎn)的類和方法或者是在非servlet環(huán)境中使用,則也是是做不到的;

總之,過濾器和攔截器的功能很類似,但是攔截器的適用范圍比過濾器更?。?/p>

Spring AOP

AOP (Aspect Orient Programming),直譯過來就是 面向切面編程,AOP 是一種編程思想,是面向?qū)ο缶幊蹋∣OP)的一種補(bǔ)充。面向切面編程,可以實(shí)現(xiàn)在不修改源代碼的情況下給程序動(dòng)態(tài)統(tǒng)一添加額外功能的一種技術(shù),AOP可以攔截指定的方法并且對方法增強(qiáng),而且無需侵入到業(yè)務(wù)代碼中,使業(yè)務(wù)與非業(yè)務(wù)處理邏輯分離;而SpringAOP,則是AOP的一種具體實(shí)現(xiàn),Spring內(nèi)部對SpringAOP的應(yīng)用最經(jīng)典的場景就是Spring的事務(wù),通過事務(wù)注解的配置,Spring會(huì)自動(dòng)在業(yè)務(wù)方法中開啟、提交業(yè)務(wù),并且在業(yè)務(wù)處理失敗時(shí),執(zhí)行相應(yīng)的回滾策略;與過濾器、攔截器相比,更加重要的是其適用范圍不再局限于SpringMVC項(xiàng)目,可以在任意一層定義一個(gè)切點(diǎn),織入相應(yīng)的操作,并且還可以改變返回值;

代碼實(shí)現(xiàn)

過濾器實(shí)現(xiàn)

傳送門:Springboot項(xiàng)目快速實(shí)現(xiàn)過濾器功能

攔截器實(shí)現(xiàn)

傳送門:Springboo項(xiàng)目快速實(shí)現(xiàn)攔截器功能

AOP實(shí)現(xiàn)

傳送門:Springboot項(xiàng)目快速實(shí)現(xiàn)Aop功能

實(shí)現(xiàn)示例源代碼地址:

https://gitcode.net/fox9916/fanfu-web.git(branch:Aop+filter+interceptor)

在實(shí)現(xiàn)示例中,主要的過濾器實(shí)現(xiàn)類、攔截器實(shí)現(xiàn)類和AOP實(shí)現(xiàn)類,與涉及到的接口之間的關(guān)系如下:

驗(yàn)證結(jié)果

匹配中同一個(gè)目標(biāo)(PersonController#getPerson())的情況下,過濾器、攔截器、SpringAOP的執(zhí)行優(yōu)先級是:

過濾器>攔截器>SpringAOP,執(zhí)行順序是先進(jìn)后出;

工作原理

從驗(yàn)證結(jié)果的輸出日志中,已經(jīng)可以看到,在匹配中同一目標(biāo)時(shí),過濾器、攔截器、SpringAOP的執(zhí)行優(yōu)先級是:過濾器>攔截器>SpringAOP,執(zhí)行順序是先進(jìn)后出,具體的不同則體現(xiàn)在以下幾個(gè)方面:

1、作用域不同

  • 過濾器依賴于servlet容器,只能在 servlet容器,web環(huán)境下使用,對請求-響應(yīng)入口處進(jìn)行過濾攔截;
  • 攔截器依賴于springMVC,可以在SpringMVC項(xiàng)目中使用,而SpringMVC的核心是DispatcherServlet,而DispatcherServlet又屬于Servlet的子類,因此作用域和過濾器類似;
  • SpringAOP對作用域沒有限制,只要定義好切點(diǎn),可以在請求-響應(yīng)的入口層(controller層)攔截處理,也可以在請求的業(yè)務(wù)處理層(service層)攔截處理;

2、顆粒度的不同

  • 過濾器的控制顆粒度比較粗,只能在doFilter()中對請求和響應(yīng)進(jìn)行過慮和攔截處理;
  • 攔截器提供更精細(xì)顆粒度的控制,有preHandle()、postHandle()、afterCompletion(),可以在controller對請求處理之前、請求處理后、請求響應(yīng)完畢織入一些業(yè)務(wù)操作;
  • SpringAOP,提供了前置通知、后置通知、返回后通知、異常通知、環(huán)繞通知,比攔截器更加精細(xì)化的顆粒度控制,甚至可以修改返回值;

總結(jié)

過濾器、攔截器、AOP本質(zhì)上來講,都是面向切面編程的實(shí)踐,只是在功能特性、適用范圍、實(shí)現(xiàn)細(xì)節(jié)上有一些區(qū)別。一般情況下,過濾器能實(shí)現(xiàn)的功能,攔截器也可以實(shí)現(xiàn);過濾器、攔截器可以實(shí)現(xiàn)的功能,AOP也可以實(shí)現(xiàn);那么在業(yè)務(wù)開發(fā)過程中作選型的時(shí)候,是不是直接用AOP就完了,其實(shí)我認(rèn)為不能這樣,還是需要根據(jù)具體的業(yè)務(wù)環(huán)境和技術(shù)環(huán)境進(jìn)行選擇,殺雞可必要用牛刀,你說呢?

以上就是Springboot項(xiàng)目Aop與攔截器與過濾器橫向?qū)Ρ鹊脑敿?xì)內(nèi)容,更多關(guān)于Aop與攔截器與過濾器的對比的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 關(guān)于HashMap源碼解讀

    關(guān)于HashMap源碼解讀

    HashMap是基于哈希表的Map接口實(shí)現(xiàn),主要用于存儲(chǔ)鍵值對,它通過數(shù)組、鏈表和紅黑樹來實(shí)現(xiàn),解決了哈希沖突問題,Java?8中,HashMap對數(shù)據(jù)結(jié)構(gòu)進(jìn)行了優(yōu)化,引入紅黑樹來提高查找效率,此外,HashMap是非線程安全的,適用于單線程環(huán)境
    2024-09-09
  • Java ShardingJDBC實(shí)戰(zhàn)演練

    Java ShardingJDBC實(shí)戰(zhàn)演練

    Sharding-JDBC 采用在 JDBC 協(xié)議層擴(kuò)展分庫分表,是一個(gè)以 jar 形式提供服務(wù)的輕量級組件,其核心思路是小而美地完成最核心的事情
    2021-11-11
  • HttpClient 請求 URL字符集轉(zhuǎn)碼問題

    HttpClient 請求 URL字符集轉(zhuǎn)碼問題

    這篇文章主要介紹了HttpClient 請求 URL字符集轉(zhuǎn)碼問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Java學(xué)習(xí)基礎(chǔ)之安裝JDK/配置JDK環(huán)境&IEDA工具安裝

    Java學(xué)習(xí)基礎(chǔ)之安裝JDK/配置JDK環(huán)境&IEDA工具安裝

    這篇文章主要介紹了Java學(xué)習(xí)基礎(chǔ)系列文章的第一篇,主要內(nèi)容是安裝JDK/配置JDK環(huán)境&IEDA工具安裝的相關(guān)資料,需要的朋友可以參考下
    2020-02-02
  • Java二維數(shù)組簡單定義與使用方法示例

    Java二維數(shù)組簡單定義與使用方法示例

    這篇文章主要介紹了Java二維數(shù)組簡單定義與使用方法,結(jié)合實(shí)例形式簡單分析了java二維數(shù)組的定義、使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-10-10
  • java枚舉enum和Enum類的使用

    java枚舉enum和Enum類的使用

    本文主要介紹了java枚舉enum和Enum類的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • springboot中動(dòng)態(tài)權(quán)限實(shí)時(shí)管理的實(shí)現(xiàn)詳解

    springboot中動(dòng)態(tài)權(quán)限實(shí)時(shí)管理的實(shí)現(xiàn)詳解

    這篇文章主要為大家詳細(xì)介紹了如何簡單實(shí)現(xiàn)一個(gè)在springboot中動(dòng)態(tài)權(quán)限的實(shí)時(shí)管理,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2024-10-10
  • 詳解Java泛型中類型擦除問題的解決方法

    詳解Java泛型中類型擦除問題的解決方法

    Java泛型的實(shí)現(xiàn)是不完整的,有時(shí)會(huì)遇到一些Java泛型類型擦除的問題。本文將詳細(xì)為大家講解Java泛型中類型擦除問題的解決方法,需要的可以參考一下
    2022-05-05
  • Java通過wait()和notifyAll()方法實(shí)現(xiàn)線程間通信

    Java通過wait()和notifyAll()方法實(shí)現(xiàn)線程間通信

    這篇文章主要為大家詳細(xì)介紹了Java通過wait()和notifyAll()方法實(shí)現(xiàn)線程間通信的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • springboot整合solr的方法詳解

    springboot整合solr的方法詳解

    這篇文章主要介紹了springboot整合solr的方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08

最新評論

神木县| 普兰店市| 金秀| 定结县| 合川市| 磐石市| 丰都县| 肃北| 专栏| 山西省| 内江市| 绥德县| 长宁区| 建宁县| 安乡县| 石屏县| 新宾| 三门县| 宣城市| 蓬安县| 北碚区| 疏勒县| 黑龙江省| 定州市| 孟州市| 阳谷县| 遂平县| 休宁县| 邢台县| 蕉岭县| 沭阳县| 新龙县| 嘉荫县| 荔浦县| 泰来县| 双柏县| 库伦旗| 林周县| 绥芬河市| 民乐县| 海阳市|