版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
知識(shí)點(diǎn)回分布式事務(wù)產(chǎn)生的原因數(shù)據(jù)庫分庫知識(shí)點(diǎn)回分布式事務(wù)產(chǎn)生的原因數(shù)據(jù)庫分庫服務(wù)soa化在分布式系統(tǒng)中,每一個(gè)機(jī)器節(jié)點(diǎn)雖然都能明確的知道自己執(zhí)行的事務(wù)是成功還是失敗,但是卻無法知道其他分布式節(jié)點(diǎn)的事務(wù)執(zhí)行情況。因此,當(dāng)一個(gè)事務(wù)要跨越多個(gè)分布式節(jié)點(diǎn)的時(shí)候(比如,下單流程,下單系統(tǒng)和庫存系統(tǒng)可能就是分別部署在不同的分布式節(jié)點(diǎn)中了保證該事務(wù)可以滿ACID,就要引入一個(gè)協(xié)調(diào)(Cooradinator)。其他的節(jié)點(diǎn)被稱為參與(Paticipant。協(xié)調(diào)者負(fù)責(zé)調(diào)度參與者的行為,并最終決定這些參與者是否要把事務(wù)進(jìn)行提交X/OPEN 應(yīng)用程序resourcemanager,資源管理,一般表示數(shù)據(jù)庫,必實(shí)現(xiàn)XA定義的接transactionmanager事務(wù)管理負(fù)責(zé)協(xié)調(diào)和事務(wù)2pc提交協(xié)議a)提交事務(wù)請(qǐng)求(投票b)執(zhí)行事務(wù)請(qǐng)求(2pc提交協(xié)議a)提交事務(wù)請(qǐng)求(投票b)執(zhí)行事務(wù)請(qǐng)求(提交或中斷2pc的數(shù)據(jù)一致性問題數(shù)據(jù)不一致。在二階段提交的階段二中,當(dāng)協(xié)調(diào)者與者發(fā)送commit請(qǐng)求之后,發(fā)生了局部網(wǎng)絡(luò)異常在發(fā)送commit請(qǐng)求過程中協(xié)調(diào)者發(fā)生了故障,這致只有一部分參與者接受到了commit請(qǐng)求。而在分參與者接到commit求之后就會(huì)執(zhí)行commit操作但是其他部分未接到commit請(qǐng)求的機(jī)器則無法執(zhí)務(wù)提交。于是整個(gè)分布式系統(tǒng)便出現(xiàn)了數(shù)據(jù)部一致同步阻塞問題。執(zhí)行過程中,所有參與節(jié)點(diǎn)都是事塞型的。當(dāng)參與者占有公共資源時(shí),其他第三方節(jié)問公共資源不得不處于阻塞二階段無法解決的問題:協(xié)調(diào)者在發(fā)出commit消息后宕而唯一接收到這條消息的參與者同時(shí)也宕機(jī)那么即使協(xié)調(diào)者通過選舉協(xié)議產(chǎn)生了新的協(xié)調(diào)者事務(wù)的狀態(tài)也是不確定的,沒人知道事務(wù)是否被已交單點(diǎn)故由于協(xié)調(diào)者的重一旦協(xié)調(diào)者發(fā)生故參與者會(huì)一直阻塞3pc提交協(xié)議增加了超參與者會(huì)一直阻塞3pc提交協(xié)議增加了超時(shí)第二階段,如果協(xié)調(diào)者超時(shí)沒有接受到參與者的反則自動(dòng)認(rèn)為失敗,發(fā)送abort命令第三階段,如果參與者超時(shí)沒有接受到協(xié)調(diào)者的反則自動(dòng)認(rèn)為成功開始提交事務(wù)(基于概率3pc的問題相對(duì)于2PC,3PC主要解決的單點(diǎn)故障問題,并減少阻認(rèn)執(zhí)行commit。而不會(huì)一直持有事務(wù)資源并處于阻塞狀協(xié)調(diào)者發(fā)送的abort響應(yīng)沒有及時(shí)被參與者接收到,那么者在等待超時(shí)之后執(zhí)行了commit操作。這樣就和其他abort命令并執(zhí)行回滾的參與者之間存在數(shù)據(jù)不一致的情XA就是X/OpenDTP定義的事務(wù)管理器與XA就是X/OpenDTP定義的事務(wù)管理器與資源管理器接口規(guī)范(即接口函數(shù)XA接口函數(shù)由數(shù)據(jù)庫廠商提JTA基于X/OpenDTP型開發(fā)的javatransactionAPi規(guī)范概到預(yù)期的效們?cè)?pc式的提的XA事務(wù),有幾個(gè).互求并沒有傳統(tǒng)企業(yè)應(yīng)用那XA事務(wù)的介入增加了TM中間件,使得系統(tǒng)復(fù)3.XA事務(wù)的性能不高,因?yàn)門M要等待RM回應(yīng),所以30s到幾分鐘,如果RM故障或者響應(yīng)比較慢,則事務(wù)的性能嚴(yán)重互聯(lián)網(wǎng)的分布式事務(wù)解決方之前所說的XA事務(wù)一樣形成X/OpenDTP那樣的工之前所說的XA事務(wù)一樣形成X/OpenDTP那樣的工業(yè)規(guī)而是僅僅在具體的行業(yè)里獲得較多的業(yè)務(wù)接口整合,避免分布式事這個(gè)方案就是把一個(gè)業(yè)務(wù)流程中需要在一個(gè)事務(wù)里執(zhí)行個(gè)相關(guān)業(yè)務(wù)接口包裝整合到一個(gè)事務(wù)中,比如我們可以講A/B/C整合為一個(gè)服務(wù)D來實(shí)現(xiàn)單一事務(wù)的業(yè)務(wù)流程最終一致性方案之ebay模式eBay2008年公布了一個(gè)關(guān)于BASE準(zhǔn)則提到一個(gè)分布的用于支付場(chǎng)景,通過對(duì)賬系統(tǒng)對(duì)事后問題進(jìn)行與數(shù)據(jù)一致性的那么在這里可以使用消息隊(duì)列那么在這里可以使用消息隊(duì)列(MQ)來先啟動(dòng)一個(gè)事務(wù),更新交易表(transaction)后,并不直新user是將要對(duì)user進(jìn)行的更新插入到消息隊(duì)列booluser(id,name,amt_sold, $buyer_id,UPDATEuserSETamt_sold=amt_sold+$amountWHEREid=UPDATEuserSET WHEREid=$buyer_id;}根據(jù)上面的偽代碼的實(shí)現(xiàn)方案,可能出現(xiàn)幾種數(shù)}根據(jù)上面的偽代碼的實(shí)現(xiàn)方案,可能出現(xiàn)幾種數(shù)據(jù)庫操作成功,向MQ中投遞消息也操作數(shù)據(jù)庫失敗,不會(huì)向MQ中投遞操作數(shù)據(jù)庫成但是向MQ中投遞消息時(shí)失向外拋異常。數(shù)據(jù)庫操作題1息出隊(duì)列以消費(fèi)者對(duì)應(yīng)的業(yè)務(wù)操作要執(zhí)行成功。如作一.盡執(zhí)行結(jié)對(duì)于第一個(gè)問題,如何保證消息不現(xiàn)在用的比較普遍的MQ都具有持久化消息的功如果者宕機(jī)或者消費(fèi)失敗,都可以執(zhí)行重試對(duì)于如何避免消息的重復(fù)1.保證消費(fèi)者的冪等也就是說如果隊(duì)列中的消息因?yàn)榫W(wǎng)與應(yīng)用一次產(chǎn)生的效果是一2.通過消費(fèi)日志表來記錄消費(fèi)狀態(tài);增加一個(gè)2.通過消費(fèi)日志表來記錄消費(fèi)狀態(tài);增加一個(gè)已經(jīng)被消費(fèi)過,消費(fèi)完成后通過本地事務(wù)控制來更新“消費(fèi)表狀態(tài)”,用來避免消息重復(fù)消費(fèi)現(xiàn)了“最終一致各大知名的電商平臺(tái)和互聯(lián)網(wǎng)公司,幾乎都是采用類似的設(shè)思路來實(shí)現(xiàn)“最終一致性”的。這種方式適合的業(yè)務(wù)場(chǎng)景廣泛,而且比較可靠。不過這種方式技術(shù)實(shí)現(xiàn)的難度比較大保證最終一致性的模式1.查詢模任何一個(gè)服務(wù)操作都提供一來向外部輸作執(zhí)行的狀務(wù)操作的使用方可以通過接口得知服作執(zhí)行的狀態(tài),然后根據(jù)不同狀態(tài)做不同的處理為了能夠?qū)崿F(xiàn)查詢,每個(gè)服務(wù)操作都需要有唯一的流2.補(bǔ)償模過過修復(fù)使得整個(gè)分布式系統(tǒng)這個(gè)過程就償模根據(jù)發(fā)起形式又自動(dòng)恢復(fù)通過對(duì)發(fā)生失敗操作的接口自動(dòng)重試或者回經(jīng)完成的動(dòng)進(jìn)行補(bǔ)通知技術(shù)通過監(jiān)控或者告警通知到技術(shù)人通過技段進(jìn)行修X/OpenDTP模型的支付寶的DTS架構(gòu)DTS(DistributedTransactionService)框架是由支付寶在X/OpenDTP模型的基礎(chǔ)上改進(jìn)的一個(gè)設(shè)計(jì),定義了類似用DTS事務(wù)DTS最大的特點(diǎn)是放寬了數(shù)據(jù)庫的強(qiáng)約束,保證了數(shù)據(jù)的最終一致性具體的流TCC分為三TCC分為三 每個(gè)階段做TRYING、 大致可以理解為SQL事務(wù)中的 TRYING階主要是對(duì)業(yè)務(wù)系統(tǒng)做檢測(cè)及資源預(yù)留G階段主要是對(duì)業(yè)務(wù)留G階段主要是對(duì)業(yè)務(wù)系統(tǒng)做確認(rèn)提交,TRYING階段執(zhí)行成功并開始執(zhí)G段時(shí),默G階段是不會(huì)只要TRYING G定成功階段主要是在業(yè)務(wù)執(zhí)行滾的狀態(tài)下執(zhí)行的業(yè)務(wù)以上所有的操作需要滿足冪等性,冪等性的實(shí)現(xiàn)1、通過唯一即每次調(diào)用的時(shí)候傳入唯一鍵值,通過唯一鍵值判斷業(yè)務(wù)是否被操作,如則不再重復(fù)2、通過狀態(tài)如何更通俗的理解TCC事務(wù)模型開源的tcc如何更通俗的理解TCC事務(wù)模型開源的tcc框架tcc-支付系統(tǒng)接收到會(huì)員的支付請(qǐng)求后,需要扣減會(huì)員賬戶余額、增加會(huì)員積分(暫時(shí)假設(shè)需要同步實(shí)現(xiàn))增加商戶賬戶余額會(huì)員系統(tǒng)、商戶系統(tǒng)、積分系統(tǒng)是獨(dú)立的三個(gè)子系統(tǒng),無法通過傳統(tǒng)的事務(wù)方式進(jìn)行處理。TRYING階段:我們需要做的就是會(huì)員資金賬戶的資金預(yù)留,即:凍結(jié)會(huì)員賬戶的金額(訂單金額)CONFIRMING階段:我們需要做的就是會(huì)員積分賬戶增加積分余額,商戶賬戶增加賬戶余額務(wù)數(shù)據(jù)設(shè)置務(wù)狀態(tài)判斷是否需要重最大努力通最大努力通面中輸出了success字樣或者標(biāo)識(shí)業(yè)務(wù)處理成功相應(yīng)狀態(tài)碼再向客戶方發(fā)起回調(diào)請(qǐng)求,直到輸出成功標(biāo)識(shí)為重很類源碼解讀要首先我們要關(guān)注的是服務(wù)的發(fā)布和服務(wù)的消費(fèi)這兩個(gè)主要的流程那么就可以基于這個(gè)點(diǎn)去找到源碼分析的突破口。那么自然而然我們就可以想到spring的配Spring對(duì)外留出的擴(kuò)展dubbo是基于 配置來實(shí)現(xiàn)服務(wù)的發(fā)布的,那么一定是基于spring的擴(kuò)展來寫了一套自己的標(biāo)簽,那么spring是如何解析這些配置在spring中定義了兩個(gè)NamespaceHandler:注冊(cè)一堆BeanDefinitionParser,利用他在spring中定義了兩個(gè)NamespaceHandler:注冊(cè)一堆BeanDefinitionParser,利用他們來進(jìn)行BeanDefinitionParser:用于解析每個(gè)element的內(nèi)Spring默認(rèn)會(huì)加載jar下的META-文件尋找對(duì)應(yīng)的NamespaceHandlerDubbo-config模塊下的dubbo-config-Dubbo的接入實(shí)Dubbo中spring擴(kuò)展就是使用spring的自定義類型,所以同樣也有、。而NamespaceHandler是publicclassDubboNamespaceHandlerextendspublicclassDubboNamespaceHandlerextendsNamespaceHandlerSupport{staticVersion.checkDuplicate(DubboNamespaceHandler.class);}publicvoidinit(){registerBeanDefinitionParser("application",newDubboBeanDefinitionParser(ApplicationConfig.classtrue));registerBeanDefinitionParser("module",newDubboBeanDefinitionParser(ModuleConfig.class,true));registerBeanDefinitionParser("registry",newDubboBeanDefinitionParser(RegistryConfig.class,true)); newDubboBeanDefinitionParser(MonitorConfig.class,true));registerBeanDefinitionParser("provider",newDubboBeanDefinitionParser(ProviderConfig.class,true));ww;wBeanDefinitionParser全部都使用了ww;wBeanDefinitionParser全部都使用了如果我們向看<dubbo:service>的配置 就直接DubboBeanDefinitionParser中這個(gè)里面主要做了一件事,把不同的配置分別轉(zhuǎn)化成 容registerBeanDefinitionParser("consumer",neDubboBeanDefinitionParser(ConsumerConfig.class,true));registerBeanDefinitionParser("protocol",neDubboBeanDefinitionParser(ProtocolConfig.class,true)); newDubboBeanDefinitionParser(ServiceBean.class,true))registerBeanDefinitionParser("reference", neDubboBeanDefinitionParser(ReferenceBean.class,false));registerBeanDefinitionParser("annotation",newDubboBeanDefinitionParser(AnnotationBean.class,true));}}中的bean對(duì)application對(duì)應(yīng)registrymonitorproviderconsumer對(duì)應(yīng)…為了在spring中的bean對(duì)application對(duì)應(yīng)registrymonitorproviderconsumer對(duì)應(yīng)…為了在spring啟動(dòng)的時(shí)候,也相應(yīng)的啟動(dòng)provider發(fā)布服務(wù)注冊(cè)服務(wù)的過而同時(shí)為了讓客戶端在啟動(dòng)的時(shí)候自動(dòng)訂閱發(fā)現(xiàn)服務(wù),加入了兩個(gè)ServiceBean、ReferenceBean分別繼承了ServiceConfig和同時(shí)還分別實(shí)現(xiàn)InitializingBean、ApplicationContextAware,ApplicationListener,InitializingBean接口為bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是繼承該接口的類,在初始化bean的時(shí)候會(huì)執(zhí)行該方DisposableBeanbean被銷毀的時(shí)候,spring容器會(huì)自動(dòng)執(zhí)行destory方法,比如釋放 實(shí)現(xiàn)了這個(gè)接口的bean,當(dāng)spring容器初始化的時(shí)候,會(huì)自動(dòng)的將ApplicationContext注入進(jìn)ApplicationEvent事件監(jiān)spring容器啟后會(huì)發(fā)一個(gè)事件BeanNameAware獲得自身初后會(huì)發(fā)一個(gè)事件BeanNameAware獲得自身初始化時(shí),本身的bean的id屬性那么基本的實(shí)現(xiàn)思路可以整理出1.利用spring的解析收集xml中的配置信息,然后把這些配置信息存儲(chǔ)到serviceConfig中2.調(diào)用ServiceConfig的export方法來進(jìn)行服務(wù)的發(fā)布和注冊(cè)服務(wù)的發(fā)ServiceBeanserviceBean是服務(wù)發(fā)布的切入點(diǎn),通過afterPropertiesSet方法,調(diào)用export()方法進(jìn)行發(fā)export為父類ServiceConfig中的方法,所以跳轉(zhuǎn)到類中的exportdelay的使我們發(fā)現(xiàn),delay的作用就是延遲暴露,我們發(fā)現(xiàn),delay的作用就是延遲暴露,而延遲的方式也很直截了1.export是synchronized修飾的方法。也就是說暴露的過程是原子操作正常情況下不會(huì)出現(xiàn)鎖競(jìng)爭(zhēng)的問題,畢竟初始化過程大多數(shù)情況下都是單一線程操作,這里聯(lián)想到了spring的初始化流程也進(jìn)行了加鎖操作,這里也給我們平時(shí)設(shè)計(jì)一個(gè)不錯(cuò)的啟示:初始化流程的性能調(diào)優(yōu)優(yōu)先級(jí)應(yīng)該放的比較低,但是安全的優(yōu)先級(jí)應(yīng)該放的比較2.繼續(xù)看doExport()方法。同樣是一堆初始化代碼export的過繼續(xù)看doExport(),最終會(huì)調(diào)用到doExportUrls()中最終實(shí)現(xiàn)在上面這段代碼中可以看到最終實(shí)現(xiàn)在上面這段代碼中可以看到Dubbo的比較核心Invoker是一個(gè)代理類,從ProxyFactory中生成。這個(gè)地方可以做一個(gè)Invoker-執(zhí)行具體的遠(yuǎn)程Protocol 服務(wù)地址的發(fā)布和Exporter–暴露服務(wù)或取消protocol發(fā)布服務(wù)我們看一下dubboProtocol的export方法:接著調(diào)用 繼續(xù)createServer創(chuàng)建服繼續(xù)看其中的createServer方法發(fā) 是通過Exchanger.bindgetExchanger方法發(fā) 是通過Exchanger.bindgetExchanger方法實(shí)際上調(diào)用的ExtensionLoader的相關(guān)方法,這里的ExtensionLoader是dubbo插件化的核心,我們會(huì)在后面的插件化講解中詳細(xì)講這里我們只需要知道Exchanger的默認(rèn)實(shí)現(xiàn)只有一個(gè):HeaderExchanger。上面一段代碼最終調(diào)用的是可以看到 實(shí)例均是在這里創(chuàng)建的, 需要一個(gè)Server類型的參數(shù),來自可以看到 實(shí)例均是在這里創(chuàng)建的, 需要一個(gè)Server類型的參數(shù),來自getTransporter回服務(wù)消ReferenceBean為切入點(diǎn),調(diào)用ReferenceBean里面的方法調(diào)用順 afterPropertiesSet()方法調(diào)用順 afterPropertiesSet()->getObject()-get()->init()->afterPropertiesSetgetObject會(huì)調(diào)用父類ReferenceConfig的initcreateProxy方法createProxy方法refprotocol.referrefprotocol.refer至此Reference在關(guān)聯(lián)了所 application至此Reference在關(guān)聯(lián)了所 application、module后調(diào)用對(duì)ProtocolreferInvokerProxy。當(dāng)用戶調(diào)用service時(shí)dubbo會(huì)通過InvokerProxy調(diào)用Invoker的invoke的方法向服務(wù)端發(fā)起請(qǐng)求??蛻舳司瓦@樣完成了自這個(gè)代理實(shí)例中僅僅包含一個(gè)對(duì)象handler了RPC調(diào)用中非常核心的一個(gè)接口Invoker<TpublicinterfaceInvoker<T>extendsNodeClass<T>publicinterfaceInvoker<T>extendsNodeClass<T>}Invoker<T>接口的核心方法是invocation),方法的參數(shù)InvocationhandlerInvoker<T于實(shí)現(xiàn)Dubbo框架中的mock功能,我們可以從他的invokeDubbo插件于實(shí)現(xiàn)Dubbo框架中的mock功能,我們可以從他的invokeDubbo插件DubboJAVASPI:它只是提供一種協(xié)議,并沒有提供相關(guān)插件化實(shí)施的接口。用過的同學(xué)都知道,它有一 java原生的支持類ServiceLoader,通過聲明接口的實(shí)現(xiàn)類,在INF/services中注冊(cè)一個(gè)實(shí)現(xiàn)類,然后通過META-INF/servicesDubbo的DubboSPISPI,DubboINF/dubbo、META-或者在文件中以properties規(guī)則一樣配置實(shí)現(xiàn)類的全面以及分配實(shí)現(xiàn)的一個(gè)名稱。我們看一下dubbo-cluster模塊的實(shí)現(xiàn)自己的擴(kuò)展點(diǎn)1目錄下新實(shí)現(xiàn)自己的擴(kuò)展點(diǎn)1目錄下新建INF/dubbo/com.alibaba.dubbo.rpc.Protocol文件,文件23.最后在main4源碼分析dubbo4源碼分析dubbo |-- |--AdaptiveExtensionFactory# |-- # |-- |-- ExtensionLoaderExtensionLoaderpublicExtensionLoaderExtensionLoaderpublicpublicstaticgetExtensionLoader,這個(gè)方法就是獲取ExtensionLoader實(shí)例的工廠方法。其public成員方法getActivateExtensiongetExtensiongetAdaptiveExtension|--Activate#|--Adaptive#|--ExtensionFactory#|--ExtensionLoader#|--SPI#該方法需該方法需 Class類型參數(shù)表示希望加載的擴(kuò)展點(diǎn)數(shù)必須是接口必須被@SPI注則拒絕處過之后首先會(huì)檢查oader緩存中是否已經(jīng)存在oader,oader,如果有則直則創(chuàng)建一 oader負(fù)責(zé)加載該擴(kuò)時(shí)將其緩以看到對(duì)于每一個(gè) 只會(huì)有一個(gè)對(duì)應(yīng)的 ExtensionLoaderExtensionFactory這里保存了對(duì)應(yīng)的ExtensionLoaderExtensionFactory這里保存了對(duì)應(yīng)的并且設(shè)置了一個(gè)額外的ory屬性,他是一個(gè) actory主要用于加載擴(kuò)展的默認(rèn)的實(shí)現(xiàn)中,它就是ExtensionFactory對(duì)應(yīng)的自適應(yīng)擴(kuò)展實(shí)現(xiàn)(每個(gè)擴(kuò)展點(diǎn)最多只能有一個(gè)自適應(yīng)實(shí)現(xiàn),如果所有實(shí)現(xiàn)中沒有被默認(rèn)的實(shí)現(xiàn)中,它就是ExtensionFactory對(duì)應(yīng)的自適應(yīng)擴(kuò)展實(shí)現(xiàn)(每個(gè)擴(kuò)展點(diǎn)最多只能有一個(gè)自適應(yīng)實(shí)現(xiàn),如果所有實(shí)現(xiàn)中沒有被現(xiàn)類),也就是說,所有對(duì)ExtensionFactoryAdpativeExtensionFactory,有@SPI注解,說明當(dāng)前這個(gè)接口extension包的結(jié)構(gòu)圖可以看到。Dubbo內(nèi)部提供了兩個(gè)實(shí)現(xiàn)類: nFactory。不同的實(shí)現(xiàn)可以以不同的方式來完成擴(kuò)這段代碼,其這段代碼,其實(shí)就相當(dāng)于一個(gè)代理入口,它會(huì)遍歷當(dāng)前系統(tǒng)中所有的ory實(shí)現(xiàn)來獲取指定的擴(kuò)展實(shí)現(xiàn),獲取到擴(kuò)展實(shí)現(xiàn),遍 ory實(shí)現(xiàn)調(diào)用 ory的所有實(shí)現(xiàn)擇的時(shí)候,并不是調(diào)用getExtension(name)來獲取某個(gè)具體的實(shí)現(xiàn)類,而是調(diào)用擇的時(shí)候,并不是調(diào)用getExtension(name)來獲取某個(gè)具體的實(shí)現(xiàn)類,而是調(diào)用我們就來分析一下getAdaptiveExtension首先檢查緩存的adaptiveInstance是否存在如果存在則直接使用否則的話 nsion方法來創(chuàng)建新的adaptiveInstance是說對(duì)于某個(gè)擴(kuò)展點(diǎn),每次調(diào)用獲取到的都是同一方法他只是簡(jiǎn)單的調(diào)方法他只是簡(jiǎn)單的調(diào) 判Extension方法中,首先通過 法獲取到最終的自適應(yīng)實(shí)現(xiàn)化一個(gè)自適應(yīng)擴(kuò)展實(shí)現(xiàn)的實(shí)getExtensionClassesClasses方法getExtensionClassesClasses方法 緩存是否被設(shè)置,如果被設(shè)置那么直接返回, xntesionClass方法動(dòng)態(tài)生成一個(gè)自適應(yīng)實(shí)現(xiàn),關(guān)于動(dòng)態(tài)生成自適應(yīng)實(shí)現(xiàn)類然后編譯加載并且實(shí)化nClasses方載完成之后就會(huì)進(jìn)行緩nClasses方載完成之后就會(huì)進(jìn)行緩對(duì)于每個(gè)擴(kuò)的加載只會(huì)們看下nClasses方從代碼里面可以看到,在Classes中首先從代碼里面可以看到,在Classes中首先會(huì)檢測(cè)擴(kuò)展點(diǎn)在@SPI注解中配置的默認(rèn)擴(kuò)并將其賦值給N
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版勞動(dòng)法:勞動(dòng)合同追訴期限解讀
- 閩教版(2020)小學(xué)信息技術(shù)六年級(jí)上冊(cè)第6課《趣味編程3:口算比賽》說課稿及反思
- 小學(xué)信息技術(shù)五年級(jí)下冊(cè)《 第7課 各色花瓶傳文明》說課稿
- 二零二五年度個(gè)人房產(chǎn)測(cè)繪及不動(dòng)產(chǎn)登記代理合同3篇
- 汽車行業(yè)產(chǎn)教融合共同體建設(shè)路徑與實(shí)踐策略
- 第21課 馬克思主義的誕生和國際共產(chǎn)主義運(yùn)動(dòng)的興起(新說課稿)2023-2024學(xué)年九年級(jí)上冊(cè)歷史(部編版)
- 一年級(jí)數(shù)學(xué)20以內(nèi)的加減法口算1000道
- 2021高考數(shù)學(xué)(文)一輪知能檢測(cè):第8章-第8節(jié)-曲線與方程
- 2024年版的版權(quán)許可協(xié)議3篇
- 第一章第一節(jié)地球的宇宙環(huán)境說課稿 -2024-2025學(xué)年人教版地理七年級(jí)上冊(cè)
- 單位工程、分部工程、分項(xiàng)工程及檢驗(yàn)批劃分方案
- 七年級(jí)數(shù)學(xué)資料培優(yōu)匯總精華
- 器樂Ⅰ小提琴課程教學(xué)大綱
- 主債權(quán)合同及不動(dòng)產(chǎn)抵押合同(簡(jiǎn)化版本)
- 服裝廠安全生產(chǎn)責(zé)任書
- JGJ202-2010建筑施工工具式腳手架安全技術(shù)規(guī)范
- 液壓爬模系統(tǒng)作業(yè)指導(dǎo)書
- 2018-2019學(xué)年北京市西城區(qū)人教版六年級(jí)上冊(cè)期末測(cè)試數(shù)學(xué)試卷
- SFC15(發(fā)送)和SFC14(接收)組態(tài)步驟
- LX電動(dòng)單梁懸掛說明書
- 旅行社公司章程53410
評(píng)論
0/150
提交評(píng)論