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種方式,這也是我之前反覆強調的,理解透原理和設計思想,很多東西都是一通百通的. Dubbo原始碼解析之SPI
dubbo版本 2.5.4 dubbo在服務發布過程中缺省會載入自適應的協議擴充套件,在類serviceconfig中存在以下初始化 下面以此進行spi過程分析。private static final protocol protocol extensionloader.getextensionlo...
dubbo原始碼解析 spi 五
之前對dubbo的spi進行了四篇的分享.大家對這個概念有了一些初步的了解.談到程式設計水平如何高階,大家可能都會異口同聲的說出三個字,看原始碼.但是我卻始終認為,程式設計光看,是永遠學不會的.關鍵還是要多動手.但是很多時候,連怎麼看原始碼都無從下手,你叫我寫仿寫原始碼,這不是開玩笑?我們可以回憶一...
Dubbo原始碼分析之SPI(二)
本篇文章是dubbo spi原始碼分析的第二篇,接著第一篇繼續分析dubbo spi的內容,我們主要介紹 getdefaultextension 獲取預設擴充套件點方法。由於此方法比較簡單,我們略過示例部分,直接分析原始碼。獲取預設擴充套件方法getdefaultextension 是乙個publi...