



下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
聊聊spring的那些擴(kuò)展機(jī)制1.背景慎?:本?將會(huì)有?量代碼出?。在看?些框架源碼的時(shí)候,可以看見(jiàn)他們很多都會(huì)和Spring去做結(jié)合。舉個(gè)例?dubbo的配置:很多?其實(shí)配置了也就配置了,沒(méi)有去過(guò)多的思考:為什么這么配置spring就能識(shí)別,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中的具體流程如下圖:其中?較常見(jiàn)的擴(kuò)展在加載BeanDefinition中和執(zhí)?BeanPostProcessor。下講述?下如何進(jìn)?這兩個(gè)的擴(kuò)展。2.1.1加載BeanDefinition在介紹加載BeanDefinition之前,先讓我們了解?下什么是BeanDefinition,顧名思義BeanDefinition描述Bean的信息的,?如他的class信息,屬性信息,是否是單例,是否延遲加載等。如何加載呢??般有兩種?段,?個(gè)是通過(guò)我們的xml,?個(gè)是通過(guò)?些擴(kuò)展?段。xml加載如下:我們?cè)趕pring的XML中配置這樣?個(gè)bean的定義,他會(huì)進(jìn)?解析然后轉(zhuǎn)換成我們的BeanDefinition。還有種?式是通過(guò)XMLschema擴(kuò)展的?式,關(guān)于xsd的?些詳細(xì)介紹可以參考這篇?章:。有些同學(xué)會(huì)問(wèn)不是還有個(gè)注解的?式嗎?我們?cè)趯W(xué)的時(shí)候?般書(shū)上都寫(xiě)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è)步驟:編寫(xiě)?個(gè)XMLschema?件描述的你節(jié)點(diǎn)元素。在resources/META-INF/?錄下定義demo.xsd?件。這?定義了?個(gè)demo的節(jié)點(diǎn)元素,其中定義了?個(gè)name字段。編寫(xiě)?個(gè)NamespaceHandler的實(shí)現(xiàn)類編寫(xiě)?個(gè)或者多個(gè)BeanDefinitionParser的實(shí)現(xiàn)(關(guān)鍵步驟).注冊(cè)上述的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)?配置:但是可以看見(jiàn)其依然是使?XMLschema擴(kuò)展進(jìn)?處理,在Spring中有個(gè)叫ContextNamespaceHandler,注冊(cè)很多解析器:其中有?個(gè)解析器是compnent-scan,在他的parse?法中定義了如何進(jìn)?注解掃描,獲取注解:利?這個(gè)擴(kuò)展機(jī)制的還有AOP,MVC,Spring-Cache以及我們的?些開(kāi)源框架?如Dubbo等。BeanFactoryPostProcessor擴(kuò)展這個(gè)機(jī)制可以讓我們?cè)谡嬲膶?shí)例化Bean之前對(duì)BeanDefinition進(jìn)?修改。這?我舉例?個(gè)實(shí)戰(zhàn)的例?,想必?家很多都配置過(guò)數(shù)據(jù)庫(kù)連接池吧,這?拿Druid來(lái)舉例:然后我們創(chuàng)建?個(gè)perties輸?:url=jdbc:mysql://localhost:3306/testusername=rootpassword=123456復(fù)制代碼對(duì)于這種配置??玩玩已經(jīng)滿?,但是在公司有個(gè)問(wèn)題,密碼放在項(xiàng)?中明碼存儲(chǔ),這樣是不?的,別?只要獲得了你項(xiàng)?的查看權(quán)限那么密碼就會(huì)被泄漏,所以?般的公司會(huì)有?個(gè)統(tǒng)?的密碼存儲(chǔ)服務(wù),只有?夠的權(quán)限才能夠使?,那么我們可以把密碼放在統(tǒng)?存儲(chǔ)服務(wù)中,通過(guò)對(duì)服務(wù)的調(diào)?才能進(jìn)?密碼的使?,那么我們?cè)趺窗褟倪h(yuǎn)程服務(wù)中獲取到的密碼注?到我們Bean中呢?那么就要使?我們的BeanFactoryPostpRrocessor,下?的代碼繼承PropertyPlaceholderConfigurer(BeanFactoryPostpRrocessor的實(shí)現(xiàn)類):在XML中有:通過(guò)這種?式我們可以有?個(gè)好處:設(shè)置統(tǒng)?配置中?,那么我們不需要修改我們項(xiàng)?中的?件,只需要在配置中?頁(yè)?中修改即可。設(shè)置統(tǒng)?密碼中?,那么我們不需要暴露明?在項(xiàng)?中,密碼如何保護(hù)那么就直接丟給密碼中?即可。2.2Bean的創(chuàng)建?般我們?cè)贏PI中獲取?個(gè)Bean都會(huì)如下操作:通過(guò)GetBean操作進(jìn)?獲取,前?我們講到過(guò)如果是?延遲加載的單例Bean那么會(huì)在容器刷新的時(shí)候進(jìn)?加載,如果是延遲加載的Bean那么會(huì)在我們獲取Bean的時(shí)候根據(jù)BeanDefinition進(jìn)?加載。?先在AbstractBeanFactory有兩個(gè)?法?個(gè)是doCreate,?個(gè)是create?來(lái)描述如何創(chuàng)建?個(gè)Bean。這?說(shuō)?下單例Bean是如何創(chuàng)建的:doCreateBean操作流程如下圖:可以看見(jiàn)真正的創(chuàng)建bean的操作在CreateBean中,對(duì)于真正的創(chuàng)建Bean有如下流程:。2.2.1Aware接?Spring提供了很多Aware接??于進(jìn)?擴(kuò)展,通過(guò)Aware我們可以設(shè)置很多想設(shè)置的東西:invokeAwareMethod提供了三種最基本的Aware,如果是ApplicationContext的話那么在ApplicationContextAwareProcessor?進(jìn)?了?輪Aware注?。BeanNameAware:如果Spring檢測(cè)到當(dāng)前對(duì)象實(shí)現(xiàn)了該接?,會(huì)將該對(duì)象實(shí)例的beanName設(shè)置到對(duì)錢對(duì)象實(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è)是我們見(jiàn)的?較多的,會(huì)將??容器注?進(jìn)去。2.2.2BeanPostProcessor在前?我們說(shuō)過(guò)BeanFactoryPostProcessor,這兩個(gè)名字很像,BeanFactoryPostProcessor是?來(lái)對(duì)我們BeanFactory中的BeanDefinition進(jìn)?處理,此時(shí)Bean還未?成。?BeanPostProcessor?來(lái)對(duì)我們?成的Bean進(jìn)?處理。在BeanPostProcessor分為兩個(gè)?法,?個(gè)是?于初始化前置處理,?個(gè)是初始化?于后置處理。有?種特殊的BeanPostProcessor,InstantiationAwareBeanPostProcessor,其會(huì)在我們實(shí)例化流程之前,如果實(shí)現(xiàn)了這個(gè)接?,那么就會(huì)使?其返回的對(duì)象實(shí)例,不會(huì)進(jìn)?后續(xù)流程。實(shí)戰(zhàn):BeanPostProcessor有什么?呢?如果你有?個(gè)需求,打點(diǎn)項(xiàng)?中?法每個(gè)?法的運(yùn)?時(shí)常,你很容易想到?AOP去做,如果不?AOP的話那么你可以使?BeanPostProcessor的后置處理?法,將對(duì)應(yīng)的每個(gè)Bean都進(jìn)?動(dòng)態(tài)代理。2.2.3InitializingBean/init-methodSpring提供了我們對(duì)Bean進(jìn)?初始化邏輯的擴(kuò)展:實(shí)現(xiàn)InitalizingBean接?:在afterPropertiesSet()通過(guò)xml?式:?法中我們可以寫(xiě)?我們的初始化邏輯。在init-method中定義了我們初始化?法。2.2.4DisposableBean/destory-method俗話說(shuō),?與死輪回不?。那么我們有了?的擴(kuò)展,?然Spring提供了死的擴(kuò)展。我們也可以通過(guò)下?兩個(gè)擴(kuò)展來(lái)實(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025簽訂采購(gòu)合同范本
- 銀行抵押擔(dān)保借款合同
- 夫妻財(cái)產(chǎn)獨(dú)立協(xié)議書(shū)
- 溴氨藍(lán)項(xiàng)目風(fēng)險(xiǎn)評(píng)估報(bào)告
- 廣東省東莞市實(shí)驗(yàn)中學(xué)2024-2025學(xué)年高一下學(xué)期3月月考英語(yǔ)試卷(含答案)
- 華南理工大學(xué)《新時(shí)代中國(guó)特色社會(huì)主義理論與實(shí)踐研究》2023-2024學(xué)年第二學(xué)期期末試卷
- 鄭州亞歐交通職業(yè)學(xué)院《品牌策劃與管理》2023-2024學(xué)年第二學(xué)期期末試卷
- 北京科技大學(xué)《藝術(shù)經(jīng)濟(jì)學(xué)(二)》2023-2024學(xué)年第二學(xué)期期末試卷
- 塑料擠吹中空成型機(jī)項(xiàng)目安全評(píng)估報(bào)告
- 廣東省韶關(guān)市新豐一中2024-2025學(xué)年高三下學(xué)期第一次模擬-生物試題試卷含解析
- GB/T 24918-2010低溫介質(zhì)用緊急切斷閥
- GB/T 14229-1993齒輪接觸疲勞強(qiáng)度試驗(yàn)方法
- 乳膏劑制備課件
- 小學(xué)英語(yǔ)一般現(xiàn)在時(shí)-(演示)課件
- 腎綜合征出血熱-課件
- 《最后一次講演》-【精品課件】
- 高一物理 必修二《機(jī)車的兩種啟動(dòng)方式》教學(xué)設(shè)計(jì)
- 2022年陜西省普通高校職業(yè)教育單獨(dú)招生統(tǒng)一考試模擬題
- 靜脈藥物調(diào)配中心PIVAS靜脈用藥配置中心靜脈藥物配置中心靜配中心調(diào)配工作簡(jiǎn)介培訓(xùn)教學(xué)課件
- 常壓熱水鍋爐產(chǎn)品質(zhì)量證明書(shū)
- 出廠檢驗(yàn)報(bào)告范本(共3頁(yè))
評(píng)論
0/150
提交評(píng)論