javascript
SpringAOP的Aspectj方式*
SpringAOP的Aspectj介紹
問題:
目前我們已經(jīng)能夠使用SpringAOP的SchemaBased方式來實(shí)現(xiàn)功能擴(kuò)展。在使用SchemaBased方式實(shí)現(xiàn)功能擴(kuò)展時(shí),發(fā)現(xiàn)一個(gè)擴(kuò)展代碼就需要聲明對(duì)應(yīng)的實(shí)現(xiàn)了指定的接口的類,這樣造成代碼的結(jié)構(gòu)體系過于繁雜。一個(gè)通知一個(gè)類。
解決:
在一個(gè)類中聲明所有的通知方法。這樣又會(huì)造成Spring容器無法區(qū)分該類中的方法那些是前置,那些是后置,那些是環(huán)繞,那些是異常了,怎么辦?在配置文件中的切面配置中,指明哪些方法是前置,哪些是后置即可。
實(shí)現(xiàn):
SpringAOP的AspectJ方式
① 創(chuàng)建一個(gè)web項(xiàng)目并導(dǎo)入AOP的相關(guān)jar包
② 在src下聲明mvc的包結(jié)構(gòu)
③在src下創(chuàng)建并配置applicationcontext.xml
a. 切點(diǎn)的bean
b.擴(kuò)展類的bean
c. 配置切面 聲明切點(diǎn) 聲明前置通知 聲明后置通知 聲明環(huán)繞通知 聲明異常通知
④ 獲取Spring容器中的擴(kuò)展對(duì)象完成功能操作。
代碼實(shí)現(xiàn)
通知類:
applicationcontext.xml
Acspectj和SchemaBased的異同
在不修改源碼的情況下都能實(shí)現(xiàn)功能的擴(kuò)展。
(1) SchemaBased方式基于接口來區(qū)別前置和后置和環(huán)繞和異常通知的,而AspectJ方式是在配置文件中使用標(biāo)簽來區(qū)分。
(2) AspectJ方式在配置中的配置方式發(fā)現(xiàn)其切點(diǎn)的聲明以及對(duì)應(yīng)的通知組裝中,切點(diǎn)只在Aop:aspect標(biāo)簽下有效。而SchemaBased方式聲明的切點(diǎn)在全局有效.SchemaBased的切點(diǎn)的通用性比AspectJ方式要好。
(3) AspectJ方式擴(kuò)展涉及參數(shù)的流程:
① 切點(diǎn)方法中聲明形參完成數(shù)據(jù)處理
② 修改通知方法聲明形參接收對(duì)應(yīng)的實(shí)參
③ 修改配置文件中的切點(diǎn)聲明,切點(diǎn)中的方法上聲明對(duì)應(yīng)的參數(shù)類型。同時(shí)還要聲明參數(shù)的形參名
④ 在通知的配置上聲明參數(shù)名
(4) 在SchemaBased方式涉及形參的流程:
① 在切點(diǎn)方法上聲明形參完成功能處理
② 在配置文件中修改切點(diǎn)的路徑為帶有參數(shù)的切點(diǎn)
③ 直接在通知方法中的形參中的Object[]中獲取參數(shù)使 用即可
總結(jié):不涉及到參數(shù)問題使用AspectJ方式完成功能擴(kuò)展比較方便,但是涉及到參數(shù)后使用SchemaBased方式比較方便。
SpringAOP的切點(diǎn)的聲明格式
① 切點(diǎn)是某包某類的無參數(shù)的方法:
示例:
execution(* com.bjsxt.service.impl.Student.test())
② 切點(diǎn)是某包某類帶有參數(shù)的方法
示例:
execution(* com.bjsxt.service.impl.Student.test(String,int))
③ 切點(diǎn)是某包某類的某個(gè)同名的所有方法
示例:… 表示任意個(gè)數(shù)任意類型的參數(shù)
execution(* com.bjsxt.service.impl.Student.test(…))
④ 切點(diǎn)是某包下的某類的所有方法
示例:表示任意的類名,方法名,包名
execution( com.bjsxt.service.impl.Student.(…))
⑤ 切點(diǎn)是某包下的所有類的所有方法
示例: 表示任意的類名,方法名,包名
execution(* com.bjsxt.service.impl..(…))
總結(jié)
以上是生活随笔為你收集整理的SpringAOP的Aspectj方式*的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringAOP的SchemaBase
- 下一篇: gradle idea java ssm