aop
是老生常談的話題了,思想都不會是一蹴而就的.比如架構設計從all in one
到soa
也是乙個逐步演進的過程,所以本篇也講講這個aop的思想演進過程.
假如我們就以aop
最常用的場景事務
來說,我們最初的做法是怎麼樣的?
public
class
employeeserviceimpl
implements
iemployeeservice
catch (exception e)
}@override
public
void
update
()catch (exception e)
}}複製**
這些**存在的問題就很明顯了,比如
優化**我們第乙個想到的是設計模式,那麼我們進入如下的優化
public
class
@test
public
void
testupdate
()throws exception
}複製**
通過裝飾設計模式,我們解決了上面遇到的兩個問題,但是同時也引出了新的問題,在客戶端我們暴露了真實的物件employeeserviceimpl
,這樣就很不安全,那麼我們可不可以把真實物件隱藏起來,讓使用者看不到呢?那麼我們進一步優化
通過這種方式,真實物件對使用者進行了一定的隱藏,但是又引出了新的問題
鑑於以上問題,我們能否再優化一下呢?答案是可以的
動態**類是在程式執行期間由jvm通過反射等機制動態的生成的,所以不存在**類的位元組碼檔案.**物件和真實物件的關係是在程式執行事情才確定的.動態**的方式和區別我們前面有講過,這裡就簡單演示一下jdk動態**
@runwith(springjunit4classrunner.class)
@contextconfiguration
public
class
jdkproxytest
@test
public
void
testupdate
()throws exception
}複製**
public
class
transactionmanagerinvocationhandle
implements
invocationhandler
//如何做增強操作(被攔截的方法在這裡增強處理)
public object invoke
(object proxy, method method, object args)
throws throwable catch (exception e)
return obj;
}}複製**
這樣,對於使用者來說,就無需再關心事務的邏輯.當然這個還需要getproxyobject
獲取動態**物件是不是還是太麻煩,那如何不呼叫getproxyobject
就無聲無息的注入動態**物件呢?可以**之前的dubbo原始碼解析-簡單原理、與spring融合
看了這麼多演進的過程,是不是還是沒有看到dubbo
原始碼的影子?因為dubbo
在做spi
的設計的時候,也是有乙個演進和優化的過程的.我們來看看dubbo是怎麼做的
//dubbo spi中的aop
複製**
下面引用文件介紹
package com.alibaba.***;
import com.alibaba.dubbo.rpc.protocol;
public
class
implemenets
protocol
// 介面方法做乙個操作後,再呼叫extension的方法
public
void
refer
() // ...
}複製**
看到這裡可能發現,dubbo裡面的spi
增加的aop
,其實就是裝飾者設計模式.但是從上面的演進中我們發現,裝飾者設計模式還是有很多弊端的,後面是逐步演進,最後到達動態**.那dubbo又是如何處理這個弊端逐步演進的?
既然本篇提到了spring的aop,那麼這裡插播乙個小技巧,spring的aop
增強方式一共有5種,分別為
增強型別
應用場景
前置增強
許可權控制、記錄呼叫日誌
後置增強
統計分析結果資料
異常增強
通過日誌記錄方法異常資訊
最終增強
釋放資源
環繞增強
快取、效能、許可權、事務管理
面試的時候也會問到5種增強方式,但是很多同學都是說,我每天都在加班,哪有時間記這些.但是其實如果你理解他的設計思想,那麼就可以"理解性記憶",以後想忘都忘不掉.
//環繞
try catch (exception e)finally
複製**
其實他這5種方式就是根據try-catch-finally
的模型來設計的,只要你記住了這個設計的思想,自然不會忘記這5種方式,這也是我之前反覆強調的,理解透原理和設計思想,很多東西都是一通百通的. AOP(面向切面程式設計)和Spring 的AOP
aop 是面向切面程式設計,相對於oop 物件導向程式設計 spring 的aop 是aop 思想的一種實現 aop 可以說是oop 的補充和完善 oop 引入封裝 繼承和多型性等概念來建立一種物件層次結構,用以模擬公共行為的乙個集合。當我們需要為分散的物件引入公共行為的時候,oop 則顯得無能為力...
IOC和AOP的理解
ioc 控制反轉也叫依賴注入。利用了工廠模式 將物件交給容器管理,你只需要在spring配置檔案總配置相應的bean,以及設定相關的屬性,讓spring容器來生成類的例項物件以及管理物件。在spring容器啟動的時候,spring會把你在配置檔案中配置的bean都初始化好,然後在你需要呼叫的時候,就...
AOP和IOC的作用
ioc 控制反轉,是一種設計模式。一層含義是控制權的轉移 由傳統的在程式中控制依賴轉移到由容器來控制 第二層是依賴注入 將相互依賴的物件分離,在spring配置檔案中描述他們的依賴關係。他們的依賴關係只在使用的時候才建立。簡單來說就是不需要new乙個物件了。aop 面向切面,是一種程式設計思想,oo...