今天由我給我公司的小伙伴們把公司的攔截器庐椒、過(guò)濾器椒舵、監(jiān)聽(tīng)器、AOP梳理的以下约谈,然后給大家一起分享了一下用途笔宿,然后又從一些問(wèn)題出發(fā)延伸出來(lái)然后探討了一番犁钟,收獲頗多。夜深人靜了泼橘,我現(xiàn)在把這些整理一下給可以看到這篇文章的小伙伴分享一下涝动。
1.思想層面
這三個(gè)東西的思想都是AOP的思想,面向切面編程炬灭。如果不太了解AOP是什么的小伙伴可以去先搞懂這個(gè)是什么醋粟,AOP 百度百科然后再來(lái)看這篇文章。這三種東西都可以通過(guò)aop的思想去實(shí)現(xiàn)一些 日志記錄担败、權(quán)限控制昔穴、事務(wù)....等一系列的操作。但是這三者有什么不同呢提前?他們適用于什么場(chǎng)景呢吗货?
2.區(qū)別
攔截器 interceptor 和 過(guò)濾器 filter 的區(qū)別:
過(guò)濾器是屬于servlet的東西是java web的三大組件之一,它定義在web.xml中狈网,由定義的先后順序來(lái)決定執(zhí)行的先后順序宙搬。它是基于函數(shù)調(diào)用的,依賴于servlet拓哺,可以對(duì)幾乎所有請(qǐng)求起作用勇垛,只能在初始化時(shí)被調(diào)用一次。重要的一點(diǎn)是它不能獲取spring 中的bean士鸥。
攔截器是由spring框架支持的闲孤,是基于java反射的,它不依賴于servlet烤礁,只對(duì)action請(qǐng)求起作用讼积。在它里面可以使用spring中的bean。在一個(gè)action請(qǐng)求中脚仔,攔截器可以被多次調(diào)用勤众,但是過(guò)濾器只能調(diào)用一次。
附圖兩張鲤脏,出自這位小伙伴的文章们颜,講的挺不錯(cuò)的。
以上總結(jié)的是網(wǎng)上一搜都可以找到的區(qū)別猎醇。我這里再拿來(lái)使用一下窥突,然后接下來(lái)我們講一講,如何在Filter中使用spring bean對(duì)象呢姑食?
剛才在比較區(qū)別的時(shí)候已經(jīng)說(shuō)了Filter不能使用spring中的bean波岛,你這里又交給我們使用這不是打臉么。音半。则拷」北停咳咳,這不是哈煌茬,原本來(lái)說(shuō) Filter里確實(shí)不支持使用spring bean斥铺,但是你可以改造啊。改造之后就可以正確使用了坛善。不信你看~~~
在你的web.xml中配置上這個(gè)東西晾蜘,然后把你的filter加上@Component,然后就可以在Filter中使用spring 的bean啦~ 是不是感覺(jué)好嗨哦眠屎?感覺(jué)人生已經(jīng)到達(dá)了巔峰剔交?
不過(guò),愛(ài)思考的你可能又要問(wèn)了改衩。這個(gè)DelegatingFilterProxy到底是個(gè)什么東西呢岖常? 看名字的話應(yīng)該叫做 委派過(guò)濾代理。 代理葫督?你有沒(méi)有想起來(lái)你曾夢(mèng)想仗劍走天涯竭鞍。。橄镜≠丝欤咳咳 跑偏了,代理模式記起來(lái)沒(méi)有?沒(méi)有洽胶?那你spring aop 總該知道把晒夹,它底層就是設(shè)計(jì)了代理模式。有兩種 一種是jdk 動(dòng)態(tài)代理姊氓,另一種是cglib字節(jié)碼增強(qiáng)惋戏。有興趣的小伙伴可以自行百度一波,這里就不展開(kāi)贅述了他膳。
然后讓我們點(diǎn)開(kāi)這個(gè)神奇的類,然后一探究竟绒窑。
initFilterBean()該方法主要完成兩個(gè)功能:
1些膨、找到被代理類在spring中配置的id并賦值給targetBeanName蟀俊。
2、使用找到的id從spring容器中找到具體被代理的類订雾,并賦值給delegate
initDelegate()該方法的作用是肢预,從spring容器中獲取到具體被代理的filter
我們知道一個(gè)過(guò)濾器的主要實(shí)現(xiàn)在doFilter()方法中,我們來(lái)看以下這個(gè)類中的doFilter方法的實(shí)現(xiàn)洼哎。
該方法主要是使用被代理的filter烫映,并調(diào)用invokeDelegate方法沼本。
然后invokeDelegate方法中主要是調(diào)用被代理的filter中實(shí)現(xiàn)的doFilter方法《Ч担看到這里應(yīng)該大家也看明白了抽兆,可能我的知識(shí)還沒(méi)有那么豐富和深厚,不過(guò)我覺(jué)得大家應(yīng)該可以看得懂這個(gè)實(shí)現(xiàn)的過(guò)程族淮。這篇文章應(yīng)該讓你對(duì)過(guò)濾器和攔截器有一點(diǎn)認(rèn)識(shí)和了解了辫红。