![聊聊spring的那些擴(kuò)展機(jī)制_第1頁](http://file4.renrendoc.com/view/cef3af7079e513e5facb12d77301d866/cef3af7079e513e5facb12d77301d8661.gif)
![聊聊spring的那些擴(kuò)展機(jī)制_第2頁](http://file4.renrendoc.com/view/cef3af7079e513e5facb12d77301d866/cef3af7079e513e5facb12d77301d8662.gif)
![聊聊spring的那些擴(kuò)展機(jī)制_第3頁](http://file4.renrendoc.com/view/cef3af7079e513e5facb12d77301d866/cef3af7079e513e5facb12d77301d8663.gif)
![聊聊spring的那些擴(kuò)展機(jī)制_第4頁](http://file4.renrendoc.com/view/cef3af7079e513e5facb12d77301d866/cef3af7079e513e5facb12d77301d8664.gif)
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
聊聊spring的那些擴(kuò)展機(jī)制1.背景慎?:本?將會(huì)有?量代碼出?。在看?些框架源碼的時(shí)候,可以看見他們很多都會(huì)和Spring去做結(jié)合。舉個(gè)例?dubbo的配置:很多?其實(shí)配置了也就配置了,沒有去過多的思考:為什么這么配置spring就能識別,dubbo就能啟動(dòng)?如果你也需要做?個(gè)框架和Spring結(jié)合,或者你想知道Spring其他框架是如何和Spring做結(jié)合的,那么你應(yīng)該了解?下Spring的擴(kuò)展機(jī)制。2.如何擴(kuò)展本篇?章想從Spring的兩個(gè)流程去介紹如何擴(kuò)展,?個(gè)是容器初始化流程,?個(gè)是Bean的創(chuàng)建流程。2.1容器的初始化要想使?Spring,第?步肯定是需要先讓容器初始化。在AbstractApplicationCont中有ext?個(gè)refresh?法定義了容器如何進(jìn)?刷新:在refresh中的具體流程如下圖:其中?較常見的擴(kuò)展在加載BeanDefinition中和執(zhí)?BeanPostProcessor。下講述?下如何進(jìn)?這兩個(gè)的擴(kuò)展。2.1.1加載BeanDefinition在介紹加載BeanDefinition之前,先讓我們了解?下什么是BeanDefinition,顧名思義BeanDefinition描述Bean的信息的,?如他的class信息,屬性信息,是否是單例,是否延遲加載等。如何加載呢??般有兩種?段,?個(gè)是通過我們的xml,?個(gè)是通過?些擴(kuò)展?段。xml加載如下:我們在spring的XML中配置這樣?個(gè)bean的定義,他會(huì)進(jìn)?解析然后轉(zhuǎn)換成我們的BeanDefinition。還有種?式是通過XMLschema擴(kuò)展的?式,關(guān)于xsd的?些詳細(xì)介紹可以參考這篇?章:。有些同學(xué)會(huì)問不是還有個(gè)注解的?式嗎?我們在學(xué)的時(shí)候?般書上都寫XML和注解兩種?式,注解其實(shí)也是使?了XMLschema的擴(kuò)展機(jī)制,等會(huì)我會(huì)細(xì)講。XMLschema擴(kuò)展什么是XMLschema的擴(kuò)展呢?Spring允許你??定義XML的的結(jié)構(gòu)并且可以???的bean解析器進(jìn)?解析。這?參考?下進(jìn)??定義擴(kuò)展的4個(gè)步驟:編寫?個(gè)XMLschema?件描述的你節(jié)點(diǎn)元素。在resources/META-INF/?錄下定義demo.xsd?件。這?定義了?個(gè)demo的節(jié)點(diǎn)元素,其中定義了?個(gè)name字段。編寫?個(gè)NamespaceHandler的實(shí)現(xiàn)類編寫?個(gè)或者多個(gè)BeanDefinitionParser的實(shí)現(xiàn)(關(guān)鍵步驟).注冊上述的schema和handler。在resources/META-INF/?錄下?創(chuàng)建spring.handler?件輸?:http\:///schema/demo=xsd.DemoNameSpaceHandler復(fù)制代碼,這?步將我們之前的標(biāo)簽的url映射到我們NamespaceHandler。再創(chuàng)建?個(gè)spring.schemas?件,輸?:http\://www.demo.me/schema/demo/demo.xsd=META-INF/demo.xsd復(fù)制代碼這?步將xsd的url進(jìn)?了映射?;氐阶⒔猓?家配置注解的時(shí)候?般都是使?下圖進(jìn)?配置:但是可以看見其依然是使?XMLschema擴(kuò)展進(jìn)?處理,在Spring中有個(gè)叫ContextNamespaceHandler,注冊很多解析器:其中有?個(gè)解析器是compnent-scan,在他的parse?法中定義了如何進(jìn)?注解掃描,獲取注解:利?這個(gè)擴(kuò)展機(jī)制的還有AOP,MVC,Spring-Cache以及我們的?些開源框架?如Dubbo等。BeanFactoryPostProcessor擴(kuò)展這個(gè)機(jī)制可以讓我們在真正的實(shí)例化Bean之前對BeanDefinition進(jìn)?修改。這?我舉例?個(gè)實(shí)戰(zhàn)的例?,想必?家很多都配置過數(shù)據(jù)庫連接池吧,這?拿Druid來舉例:然后我們創(chuàng)建?個(gè)perties輸?:url=jdbc:mysql://localhost:3306/testusername=rootpassword=123456復(fù)制代碼對于這種配置??玩玩已經(jīng)滿?,但是在公司有個(gè)問題,密碼放在項(xiàng)?中明碼存儲,這樣是不?的,別?只要獲得了你項(xiàng)?的查看權(quán)限那么密碼就會(huì)被泄漏,所以?般的公司會(huì)有?個(gè)統(tǒng)?的密碼存儲服務(wù),只有?夠的權(quán)限才能夠使?,那么我們可以把密碼放在統(tǒng)?存儲服務(wù)中,通過對服務(wù)的調(diào)?才能進(jìn)?密碼的使?,那么我們怎么把從遠(yuǎn)程服務(wù)中獲取到的密碼注?到我們Bean中呢?那么就要使?我們的BeanFactoryPostpRrocessor,下?的代碼繼承PropertyPlaceholderConfigurer(BeanFactoryPostpRrocessor的實(shí)現(xiàn)類):在XML中有:通過這種?式我們可以有?個(gè)好處:設(shè)置統(tǒng)?配置中?,那么我們不需要修改我們項(xiàng)?中的?件,只需要在配置中?頁?中修改即可。設(shè)置統(tǒng)?密碼中?,那么我們不需要暴露明?在項(xiàng)?中,密碼如何保護(hù)那么就直接丟給密碼中?即可。2.2Bean的創(chuàng)建?般我們在API中獲取?個(gè)Bean都會(huì)如下操作:通過GetBean操作進(jìn)?獲取,前?我們講到過如果是?延遲加載的單例Bean那么會(huì)在容器刷新的時(shí)候進(jìn)?加載,如果是延遲加載的Bean那么會(huì)在我們獲取Bean的時(shí)候根據(jù)BeanDefinition進(jìn)?加載。?先在AbstractBeanFactory有兩個(gè)?法?個(gè)是doCreate,?個(gè)是create?來描述如何創(chuàng)建?個(gè)Bean。這?說?下單例Bean是如何創(chuàng)建的:doCreateBean操作流程如下圖:可以看見真正的創(chuàng)建bean的操作在CreateBean中,對于真正的創(chuàng)建Bean有如下流程:。2.2.1Aware接?Spring提供了很多Aware接??于進(jìn)?擴(kuò)展,通過Aware我們可以設(shè)置很多想設(shè)置的東西:invokeAwareMethod提供了三種最基本的Aware,如果是ApplicationContext的話那么在ApplicationContextAwareProcessor?進(jìn)?了?輪Aware注?。BeanNameAware:如果Spring檢測到當(dāng)前對象實(shí)現(xiàn)了該接?,會(huì)將該對象實(shí)例的beanName設(shè)置到對錢對象實(shí)例中。會(huì)將加載當(dāng)前Bean的ClassLoader注?進(jìn)去。BeanFactoryAware:將當(dāng)前BeanFactory容器注?進(jìn)去。BeanClassLoaderAware:如果使?ApplicaitonContextEnvironmentAware:將上下?中Enviroment注?進(jìn)去,?般獲取配置屬性時(shí)可以使?。將上下?中EmbeddedValueResolver注?進(jìn)去,?般?于參數(shù)解析。ResourceLoaderAware:將上類型的容器的話?會(huì)有下??種:EmbeddedValueResolverAware:下?設(shè)置進(jìn)去。ApplicationEventPublisherAware:在ApplicationContext中實(shí)現(xiàn)了ApplicationEventPublisher接?,所以可以將??注?進(jìn)去。MessageSourceAware:將??注?。ApplicationContextAware:這個(gè)是我們見的?較多的,會(huì)將??容器注?進(jìn)去。2.2.2BeanPostProcessor在前?我們說過BeanFactoryPostProcessor,這兩個(gè)名字很像,BeanFactoryPostProcessor是?來對我們BeanFactory中的BeanDefinition進(jìn)?處理,此時(shí)Bean還未?成。?BeanPostProcessor?來對我們?成的Bean進(jìn)?處理。在BeanPostProcessor分為兩個(gè)?法,?個(gè)是?于初始化前置處理,?個(gè)是初始化?于后置處理。有?種特殊的BeanPostProcessor,InstantiationAwareBeanPostProcessor,其會(huì)在我們實(shí)例化流程之前,如果實(shí)現(xiàn)了這個(gè)接?,那么就會(huì)使?其返回的對象實(shí)例,不會(huì)進(jìn)?后續(xù)流程。實(shí)戰(zhàn):BeanPostProcessor有什么?呢?如果你有?個(gè)需求,打點(diǎn)項(xiàng)?中?法每個(gè)?法的運(yùn)?時(shí)常,你很容易想到?AOP去做,如果不?AOP的話那么你可以使?BeanPostProcessor的后置處理?法,將對應(yīng)的每個(gè)Bean都進(jìn)?動(dòng)態(tài)代理。2.2.3InitializingBean/init-methodSpring提供了我們對Bean進(jìn)?初始化邏輯的擴(kuò)展:實(shí)現(xiàn)InitalizingBean接?:在afterPropertiesSet()通過xml?式:?法中我們可以寫?我們的初始化邏輯。在init-method中定義了我們初始化?法。2.2.4DisposableBean/destory-method俗話說,?與死輪回不?。那么我們有了?的擴(kuò)展,?然Spring提供了死的擴(kuò)展。我們也可以通過下?兩個(gè)擴(kuò)展來實(shí)現(xiàn)我們銷毀的邏輯:DisposableBean:實(shí)現(xiàn)DisposableBean接?實(shí)現(xiàn)destroy?法即可。實(shí)現(xiàn)XML:在destroy-method中定義銷毀?法。PS:在我們Spring容器中如果要在JVM關(guān)閉時(shí)?動(dòng)調(diào)?關(guān)閉的?法那么我們可以((ClassPathXm
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 蘇州蘇教版三年級數(shù)學(xué)上冊第一單元《兩、三位數(shù)乘一位數(shù)》聽評課記錄
- 七年級數(shù)學(xué)上冊第5章一元一次方程5.4一元一次方程的應(yīng)用第4課時(shí)利率等其他問題聽評課記錄(新版浙教版)
- 人教版數(shù)學(xué)七年級下冊5.1.2《垂線》聽評課記錄2
- 統(tǒng)編版初中語文七年級下冊第四課《孫權(quán)勸學(xué)》聽評課記錄
- 新版湘教版秋八年級數(shù)學(xué)上冊第四章一元一次不等式組課題不等式聽評課記錄
- 聽評四年級音樂課記錄
- 聽評課記錄七年級歷史
- 七年級數(shù)學(xué)上冊第11課時(shí)有理數(shù)的乘法運(yùn)算律聽評課記錄新湘教版
- 人教版七年級數(shù)學(xué)上冊:1.4.2 《有理數(shù)的除法》聽評課記錄
- 粵人版地理七年級下冊《第三節(jié) 巴西》聽課評課記錄2
- GB/T 32691-2016汽車空調(diào)電磁離合器
- 第八章 客戶關(guān)系管理
- 新版人教版高中英語選修一、選修二詞匯表
- 2022年河北邯鄲世紀(jì)建設(shè)投資集團(tuán)有限公司招聘筆試試題及答案解析
- 萬物有靈且美(讀書心得)課件
- 住院患者跌倒墜床質(zhì)量控制管理考核標(biāo)準(zhǔn)
- 人民醫(yī)院醫(yī)共體財(cái)務(wù)管理部工作手冊
- 戰(zhàn)略規(guī)劃培訓(xùn)luqiang課件
- 高三日語一輪復(fù)習(xí)之自謙語句型課件
- YYT 0325-2022 一次性使用無菌導(dǎo)尿管
- 收取執(zhí)行款銀行賬戶確認(rèn)書
評論
0/150
提交評論