AOP面向切面編程
開發時:核心業務代碼與服務系統代碼是相對獨立的;運行時:核心業務執行時,擁有系統服務的功能。實現這種效果的技術就是AOP
AOP面向切面編程,採用的是橫向抽取機制,將分散在各個方法上的重複的代碼提取出來,然後再程序編譯或運行時,再將這些提取出來的代碼應用到需要執行的地方。
AOP的本質就是代理,對方法進行增強。
兩種代理
JDK的動態代理→基於接口的
CGLIB代理→基於子類
Spring AOP面向切面編程
Advice通知:AOP在特定切點上執行的增強處理。
Pointcut切點:對那些類、那些方法進行增強。
Aspect切面:通常是一個類,裏面定義了通知和切點,如果切點定義在了切面外,那麼其他的切面都可以引用。
AOP=通知+切點
通知類型
method:增強執行的方法,是方法的名字。
pointcut-ref:指定對哪個方法進行增強
前通知:方法執行前通知
<aop:before method="" pointcut-ref=""/>
後通知:方法執行後通知,又被成爲最終通知,無論如何都會被執行
<aop:after method="" pointcut-ref=""/>
返回後通知:只有正常返回纔會執行
<aop:after-returning method="" pointcut-ref=""/>
異常通知:發生異常後
<aop:after-throwing method="" pointcut-ref=""/>
環繞通知:在方法的執行前後進行增強,等同於:前通知+返回後通知
<aop:around method="" pointcut-ref=""/>
Pointcunt 切點
JDK**Pointcut 基於正則表達式的切點
AspectJExpressionPointCunt 基於AOP的切點表達式.
Aspect開發
基於XML配置文件的AspectJ開發
<bean id="user" class="cn.bean.User"></bean>
<!-- 配置通知類 -->
<bean class="cn.demo.MyAdvice" id="myAdvice"></bean>
<aop:config>
<!-- 定義切面 -->
<aop:aspect ref="myAdvice">
<!-- 定義一個切點
使用AspectJ切點表達式
execution(返回類型 包路徑)
-->
<aop:pointcut expression="execution(* cn.bean.User.login())" id="cut1"/>
<!-- 配置前通知
method:增強執行的方法
-->
<aop:before method="doBefore" pointcut-ref="cut1"/>
<!-- 後通知 -->
<aop:pointcut expression="execution(* cn.bean.User.loginOut())" id="cut2"/>
<aop:after method="doAfter" pointcut-ref="cut2"/>
</aop:aspect>
</aop:config>
基於註解的方式