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