dubbo原始碼解析 spi 4

2021-09-12 01:39:09 字數 2846 閱讀 7975

aop是老生常談的話題了,思想都不會是一蹴而就的.比如架構設計從all in onesoa也是乙個逐步演進的過程,所以本篇也講講這個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...