關於面向切面程式設計AOP
什麼是AOP
AOP Aspect Oriented Programing 面向切面程式設計 AOP採取橫向抽取機制,取代了傳統縱向繼承體系重複性程式碼(效能監視、事務管理、安全檢查、快取) Spring AOP使用純Java實現,不需要專門的編譯過程和類載入器,在執行期通過代理方式向目標類織入增強程式碼 AspecJ是一個基於Java語言的AOP框架,Spring2.0開始,Spring AOP引入對Aspect的支援,AspectJ擴充套件了Java語言,提供了一個專門的編譯器,在編譯時提供橫向程式碼的織入
AOP的一些相關的專業術語
Joinpoint(連線點):所謂連線點是指那些被攔截到的點。在spring中,這些點指的是方法,因為spring只支援方法型別的連線點. *Pointcut(切入點):*所謂切入點是指我們要對哪些Joinpoint進行攔截的定義. *Advice(通知/增強):*所謂通知是指攔截到Joinpoint之後所要做的事情就是通知.通知分為前置通知,後置通知,異常通知,最終通知,環繞通知(切面要完成的功能) *Introduction(引介):*引介是一種特殊的通知在不修改類程式碼的前提下, Introduction可以在執行期為類動態地新增一些方法或Field. *Target(目標物件):*代理的目標物件 *Weaving(織入):*是指把增強應用到目標物件來建立新的代理物件的過程. spring採用動態代理織入,而AspectJ採用編譯期織入和類裝在期織入 *Proxy(代理):*一個類被AOP織入增強後,就產生一個結果代理類 Aspect(切面):
AOP的相關增強型別
AOP聯盟為通知Advice定義了org.aopalliance.aop.Interface.Advice Spring按照通知Advice在目標類方法的連線點位置,可以分為5類
- 前置通知: org.springframework.aop.MethodBeforeAdvice 在目標方法執行前實施增強
- 後置通知:org.springframework.aop.AfterReturningAdvice 在目標方法執行後實施增強
- 環繞通知:org.aopalliance.intercept.MethodInterceptor 在目標方法執行前後實施增強
- 異常丟擲通知:org.springframework.aop.ThrowsAdvice 在方法丟擲異常後實施增強
- 引介通知:org.springframework.aop.IntroductionInterceptor 在目標類中新增一些新的方法和屬性
AOP切面型別
- Advisor : 代表一般切面,Advice本身就是一個切面,對目標類所有方法進行攔截
- PointcutAdvisor:代表具有切點的切面,可以指定攔截目標類哪些方法。
- IntroductionAdvisor:代表引介切面,針對引介通知而是用切面
使用AspectJ實現AOP
@AspectJ 簡介
- AspectJ是一個基於Java語言的AOP框架
- Spring2.0以後新增了對AspectJ切點表示式支援
- @AspectJ 是AspectJ1.5新增功能,通過JDK5註解技術,允許直接在Bean類中定義切面
- 新版本Spring框架,建議使用AspectJ方式來開發AOP
- 使用AspectJ 需要匯入Spring AOP和 AspectJ相關jar包
- spring-aop-3.2.0.RELEASE.jar com.springsource.org.aopalliance-1.0.0.jar spring-aspects-3.2.0.RELEASE.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar 通過配置啟用@AspectJ切面
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 開啟AspectJ自動代理-->
<aop:aspectj-autoproxy />
</beans>
@AspectJ提供不同的通知型別
[email protected] 前置通知,相當於BeforeAdvice
- @AfterReturning 後置通知,相當於AfterReturningAdvice
- @Around 環繞通知,相當於MethodInterceptor
- @AfterThrowing丟擲通知,相當於ThrowAdvice
- @After 最終final通知,不管是否異常,該通知都會執行
- @DeclareParents 引介通知,相當於IntroductionInterceptor (不要求掌握)