肥朝 Dubbo SPI和AOP的前世今生

2021-09-24 06:51:58 字數 2848 閱讀 8053

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種方式,這也是我之前反覆強調的,理解透原理和設計思想,很多東西都是一通百通的.

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...