AOP即面向切面編程。AOP是基于代理模式的。 代理模式: 當(dāng)我們需要修改一個類,在類中加入代碼時,為了不破壞這個類的封裝性。可以使用代理模式,建立一個代理類。 比如:修改需求,在調(diào)用UserController類的saveUser()方法之前要判斷用戶是否有權(quán)限,普通的辦法我們可以直接修改類中的saveUser()方法。用代理模式就是,建立一個代理類,在調(diào)用saveUser()方法之前再加入鑒權(quán)的方法,以后調(diào)用時我們調(diào)用代理類,而不直接調(diào)用UserController類了。 class UserControllerProxy {
不過Spring AOP是在程序運行的過程中織入的,是動態(tài)織入。還有一種面向切面的是AspectJ,它是基于靜態(tài)織入的。靜態(tài)織入是指在編譯時期就織入,即編譯出來的class文件,字節(jié)碼就已經(jīng)被織入了。官方文檔的一張圖:
AOP相關(guān)概念: 將多個類共有的功能抽象出來,形成一個新的類,這個類就叫做切面,或者切片(Aspect),在我們需要用到這個功能的時候就調(diào)用這個切面類中的方法,依靠依賴注入DI將功能注入進(jìn)去。 例如上面的添加鑒權(quán)功能,就可以建立一個鑒權(quán)的切面類,在需要用到的地方切進(jìn)去,這個切入的地方就叫做切入點(Joinpoint)。類似的功能就是攔截器(Intercepter)。攔截這個概念是AOP的一種實現(xiàn)策略,在某個方法被執(zhí)行時,攔截器可以攔截下來,在方法執(zhí)行之前執(zhí)行別的方法,比如鑒權(quán)。也可以在方法執(zhí)行之后再執(zhí)行別的方法,攔截器就是一個動態(tài)攔截Action調(diào)用的對象。他提供了中機制是開發(fā)者可以在一個Action執(zhí)行之前或執(zhí)行之后插入需要的代碼。 |
|