aop是oop的延續,是aspect oriented programming的縮寫,意思是面向切面程式設計。可以通過預編譯方式和執行期動態**實現在不修改源**的情況下給程式動態統一新增功能的一種技術。aop實際是gof設計模式的延續,設計模式孜孜不倦追求的是呼叫者和被呼叫者之間的解耦,aop可以說也是這種目標的一種實現。
我們現在做的一些非業務,如:日誌、事務、安全等都會寫在業務**中(也即是說,這些非業務類橫切於業務類),但這些**往往是重複,複製——貼上式的**會給程式的維護帶來不便,aop就實現了把這些業務需求與系統需求分開來做。這種解決的方式也稱**機制。
連線點(joinpoint):程式執行過程中的某一行為,例如,userservice.get的呼叫或者userservice.delete丟擲異常等行為。
通知(advice):「切面」對於某個「連線點」所產生的動作,例如,testaspect中對com.spring.service包下所有類的方法進行日誌記錄的動作就是乙個advice。其中,乙個「切面」可以包含多個「advice」,例如serviceaspect。
切入點(pointcut):匹配連線點的斷言,在aop中通知和乙個切入點表示式關聯。例如,testaspect中的所有通知所關注的連線點,都由切入點表示式execution(* com.spring.service.*.*(..))來決定。
目標物件(target object):被乙個或者多個切面所通知的物件。例如,aservcieimpl和bserviceimpl,當然在實際執行時,spring aop採用**實現,實際aop操作的是targetobject的**物件。
aop**(aop proxy):在spring aop中有兩種**方式,jdk動態**和cglib**。預設情況下,targetobject實現了介面時,則採用jdk動態**,例如,aserviceimpl;反之,採用cglib**,例如,bserviceimpl。強制使用cglib**需要將 的 proxy-target-class屬性設為true。
通知(advice)型別:
注:可以將多個通知應用到乙個目標物件上,即可以將多個切面織入到同一目標物件。
使用spring aop可以基於兩種方式,一種是比較方便和強大的註解方式,另一種則是中規中矩的xml配置方式。
先說註解,使用註解配置spring aop總體分為兩步,第一步是在xml檔案中宣告啟用自動掃瞄元件功能,同時啟用自動**功能(同時在xml中新增乙個userservice的普通服務層元件,來測試aop的註解功能):
<?xml version="1.0" encoding="utf-8"?>
/**
* 系統服務元件aspect切面bean
* @author shenghany
* @date 2013-5-28
*///宣告這是乙個元件
@component
//宣告這是乙個切面bean
@aspect
public class serviceaspect
/** 配置前置通知,使用在方法aspect()上註冊的切入點
* 同時接受joinpoint切入點物件,可以沒有該引數
*/@before("aspect()")
public void before()
//配置後置通知,使用在方法aspect()上註冊的切入點
@after("aspect()")
public void after(joinpoint joinpoint)
//異常通知
@after-returning("aspect()")
public void throwtlog()
//最終通知
@after-throwing("aspect()")
public void afterlog()
}
在執行結果中會發現順序有所變化,所以使用註解配置aop的話最好使用環形通知的註解@arround AOP基於註解實現
切面類 component 控制反轉 aspect 宣告切面類 public class forumadvisor after execution com.mitu.aspect.宣告後置增強 public void after around execution com.mitu.aspect.宣告...
基於註解的AOP配置
before 前置通知 afterreturning 後置通知 after 最終通知 afterthrowing 異常通知 around 環繞通知 pointcut 指定切入點表示式 使用方法 pointcut execution cn.itcast.service.impl.private voi...
基於註解的 AOP 開發
同理一樣的做法,將配置檔案的標籤變為註解 建立目標介面和目標類 內部有切點 public inte ce targetinte ce component target public class target implements targetinte ce 建立切面類 內部有增強方法 將目標類和切面...