基于Spring的插件化開發(fā)方案

概述

前置項(xiàng)目中桨螺,經(jīng)常有定制的需求科汗,如何更優(yōu)雅實(shí)現(xiàn)定制的需求

前置云端拆分第一階段般卑,是把前置云端的代碼拆分武鲁,第二階段的目標(biāo)是實(shí)現(xiàn)前置云端共用一個(gè)SDK,如何實(shí)現(xiàn)擴(kuò)展性成了一個(gè)問題蝠检,我試著給出自己的思考

設(shè)計(jì)模式

對(duì)于一些有可能發(fā)生變化的地方洞坑,進(jìn)行封裝(關(guān)注點(diǎn)分離),應(yīng)用策略模式蝇率、責(zé)任鏈模式等手段進(jìn)行擴(kuò)展點(diǎn)設(shè)計(jì)迟杂。

擴(kuò)展點(diǎn)

Java原生SPI

JAVA SPI = 基于接口的編程+策略模式+配置文件 的動(dòng)態(tài)加載機(jī)制

對(duì)于Java中的SPI,有如下的約定:

  1. 在META-INF/services/目錄中創(chuàng)建以接口全限定名命名的文件該文件內(nèi)容為Api具體實(shí)現(xiàn)類的全限定名
  2. 使用ServiceLoader類動(dòng)態(tài)加載META-INF中的實(shí)現(xiàn)類
  3. 如SPI的實(shí)現(xiàn)類為Jar則需要放在主程序classPath中
  4. Api具體實(shí)現(xiàn)類必須有一個(gè)不帶參數(shù)的構(gòu)造方法

實(shí)際上就是JDK的就是ServiceLoader 會(huì)遍歷所有jar查找META-INF/services/接口類名 文件本慕,找到后就加載文件中配置的文件進(jìn)行實(shí)例化使用排拷。

Spring的擴(kuò)展點(diǎn)

SPI實(shí)現(xiàn)機(jī)制

在Spring中提供了SPI機(jī)制,我們只需要在 META-INF/spring.factories 中配置接口實(shí)現(xiàn)類名锅尘,即可通過服務(wù)發(fā)現(xiàn)機(jī)制监氢,在運(yùn)行時(shí)加載接口的實(shí)現(xiàn)類:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration

配置好 spring.factories 文件后,我們就可以通過 SpringFactoriesLoader 動(dòng)態(tài)加載接口實(shí)現(xiàn)類了

BeanFactoryPostProcessor接口

BeanFactory生成后藤违,如果想對(duì)BeanFactory進(jìn)行一些處理浪腐,該怎么辦呢?BeanFactoryPostProcessor接口就是用來處理BeanFactory的顿乒。

BeanDefinitionRegistryPostProcessor接口

在Spring容器初始化時(shí)议街,首先會(huì)讀取應(yīng)用程序中的配置文件,并解析出所有的Bean定義璧榄,然后將這些Bean定義注冊(cè)到容器中特漩。在這個(gè)過程中,BeanDefinitionRegistryProcessor提供了一種機(jī)制骨杂,允許開發(fā)人員在Bean定義注冊(cè)之前和之后對(duì)Bean定義進(jìn)行自定義處理涂身,例如添加,修改或刪除Bean定義等搓蚪。

Mybatis中org.mybatis.spring.mapper.MapperScannerConfigurer就實(shí)現(xiàn)了該方法蛤售,在只有接口沒有實(shí)現(xiàn)類的情況下找到接口方法與sql之間的聯(lián)系從而生成BeanDefinition并注冊(cè)。

BeanPostProcessor接口

在Spring容器實(shí)例化bean之后妒潭,在執(zhí)行bean的初始化方法前后悴能,允許我們自定義修改新的bean實(shí)例,如修改bean的屬性杜耙,可以給bean生成一個(gè)動(dòng)態(tài)代理實(shí)例等等搜骡。

Spring AOP的底層處理也是通過實(shí)現(xiàn)BeanPostProcessor來執(zhí)行代理包裝邏輯的。

AOP

AOP為Aspect Oriented Programming的縮寫佑女,意為:面向切面編程记靡,通過預(yù)編譯方式和運(yùn)行動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)谈竿。AOP是OOP的延續(xù),是軟件開發(fā)中的一個(gè)熱點(diǎn)摸吠,也是Spring框架中的一個(gè)重要內(nèi)容空凸,是函數(shù)式編程的一種衍生范型。利用AOP可以對(duì)業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離寸痢,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低呀洲,提高程序的可重用性,同時(shí)提高開發(fā)的效率啼止。

我們一般做活動(dòng)的時(shí)候道逗,一般對(duì)每一個(gè)接口都會(huì)做活動(dòng)的有效性校驗(yàn)(是否開始、是否結(jié)束等等)献烦、以及這個(gè)接口是不是需要用戶登錄滓窍。

AOP+設(shè)計(jì)模式

可配置化

插件化

常見的動(dòng)態(tài)插件的實(shí)現(xiàn)方式有 SPI、OSGI 等方案巩那,插件化開發(fā)模式正在很多編程語言或技術(shù)框架中得以廣泛的應(yīng)用實(shí)踐吏夯,比如大家熟悉的jenkins,docker可視化管理平臺(tái)rancher即横,以及日常編碼使用的編輯器idea噪生,eclipse等,隨處可見的帶有熱插拔功能的插件东囚,讓系統(tǒng)像插了翅膀一樣跺嗽,大大提升了系統(tǒng)的擴(kuò)展性和伸縮性,也拓展了系統(tǒng)整體的使用價(jià)值舔庶。

1 模塊解耦

實(shí)現(xiàn)服務(wù)模塊之間解耦的方式有很多抛蚁,但是插件來說,其解耦的程度似乎更高惕橙,而且更靈活,可定制化钉跷、個(gè)性化更好弥鹦。

2 提升擴(kuò)展性和開放性

插件化機(jī)制讓系統(tǒng)的擴(kuò)展性得以提升,從而可以豐富系統(tǒng)的周邊應(yīng)用生態(tài)爷辙。

3 方便第三方接入

有了插件之后彬坏,第三方應(yīng)用或系統(tǒng)如果要對(duì)接自身的系統(tǒng),直接基于系統(tǒng)預(yù)留的插件接口完成一套適合自己業(yè)務(wù)的實(shí)現(xiàn)即可膝晾,而且對(duì)自身系統(tǒng)的侵入性很小栓始,甚至可以實(shí)現(xiàn)基于配置參數(shù)的熱加載,方便靈活血当,開箱即用幻赚。

最佳實(shí)踐

  1. 面向接口編程
  2. 方法粒度足夠細(xì)(對(duì)應(yīng)一個(gè)功能點(diǎn))禀忆,方法異常能夠區(qū)分
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市落恼,隨后出現(xiàn)的幾起案子箩退,更是在濱河造成了極大的恐慌,老刑警劉巖佳谦,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戴涝,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡钻蔑,警方通過查閱死者的電腦和手機(jī)啥刻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咪笑,“玉大人可帽,你說我怎么就攤上這事∑牙撸” “怎么了蘑拯?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)兜粘。 經(jīng)常有香客問我申窘,道長(zhǎng),這世上最難降的妖魔是什么孔轴? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任剃法,我火速辦了婚禮,結(jié)果婚禮上路鹰,老公的妹妹穿的比我還像新娘贷洲。我一直安慰自己,他們只是感情好晋柱,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布优构。 她就那樣靜靜地躺著,像睡著了一般雁竞。 火紅的嫁衣襯著肌膚如雪钦椭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天碑诉,我揣著相機(jī)與錄音彪腔,去河邊找鬼。 笑死进栽,一個(gè)胖子當(dāng)著我的面吹牛德挣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播快毛,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼格嗅,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼番挺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吗浩,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤建芙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后懂扼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體禁荸,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年阀湿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赶熟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡陷嘴,死狀恐怖映砖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情灾挨,我是刑警寧澤邑退,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站劳澄,受9級(jí)特大地震影響地技,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜秒拔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一莫矗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧砂缩,春花似錦作谚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至双吆,卻和暖如春彬伦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伊诵。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留回官,地道東北人曹宴。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像歉提,于是被迫代替她去往敵國和親笛坦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子区转,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)版扩,斷路器废离,智...
    卡卡羅2017閱讀 134,702評(píng)論 18 139
  • SPI機(jī)制:為某個(gè)接口尋找服務(wù)實(shí)現(xiàn)的機(jī)制 java SPI就是提供這樣的一個(gè)機(jī)制 ,需要在META-INF目錄中設(shè)...
    上尤流蘇閱讀 1,441評(píng)論 0 1
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong閱讀 22,435評(píng)論 1 92
  • 2021年10月19日更新近期發(fā)現(xiàn)這篇文章閱讀量還不少礁芦,為了避免誤導(dǎo)大家蜻韭,更新一下說法。這種插件化的方式其實(shí)是我早...
    MisterCH閱讀 17,915評(píng)論 2 13
  • 文章概要 起因和概述 常用注解解析控制反轉(zhuǎn)IOC柿扣,容器的作用依賴注入DI肖方,獲取對(duì)象的作用面象切面AOP聲明式事務(wù)T...
    4ea0af17fd67閱讀 2,216評(píng)論 1 3