聊聊spring的那些擴展機制_第1頁
聊聊spring的那些擴展機制_第2頁
聊聊spring的那些擴展機制_第3頁
聊聊spring的那些擴展機制_第4頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

聊聊spring的那些擴展機制1.背景慎?:本?將會有?量代碼出?。在看?些框架源碼的時候,可以看見他們很多都會和Spring去做結合。舉個例?dubbo的配置:很多?其實配置了也就配置了,沒有去過多的思考:為什么這么配置spring就能識別,dubbo就能啟動?如果你也需要做?個框架和Spring結合,或者你想知道Spring其他框架是如何和Spring做結合的,那么你應該了解?下Spring的擴展機制。2.如何擴展本篇?章想從Spring的兩個流程去介紹如何擴展,?個是容器初始化流程,?個是Bean的創(chuàng)建流程。2.1容器的初始化要想使?Spring,第?步肯定是需要先讓容器初始化。在AbstractApplicationCont中有ext?個refresh?法定義了容器如何進?刷新:在refresh中的具體流程如下圖:其中?較常見的擴展在加載BeanDefinition中和執(zhí)?BeanPostProcessor。下講述?下如何進?這兩個的擴展。2.1.1加載BeanDefinition在介紹加載BeanDefinition之前,先讓我們了解?下什么是BeanDefinition,顧名思義BeanDefinition描述Bean的信息的,?如他的class信息,屬性信息,是否是單例,是否延遲加載等。如何加載呢??般有兩種?段,?個是通過我們的xml,?個是通過?些擴展?段。xml加載如下:我們在spring的XML中配置這樣?個bean的定義,他會進?解析然后轉(zhuǎn)換成我們的BeanDefinition。還有種?式是通過XMLschema擴展的?式,關于xsd的?些詳細介紹可以參考這篇?章:。有些同學會問不是還有個注解的?式嗎?我們在學的時候?般書上都寫XML和注解兩種?式,注解其實也是使?了XMLschema的擴展機制,等會我會細講。XMLschema擴展什么是XMLschema的擴展呢?Spring允許你??定義XML的的結構并且可以???的bean解析器進?解析。這?參考?下進??定義擴展的4個步驟:編寫?個XMLschema?件描述的你節(jié)點元素。在resources/META-INF/?錄下定義demo.xsd?件。這?定義了?個demo的節(jié)點元素,其中定義了?個name字段。編寫?個NamespaceHandler的實現(xiàn)類編寫?個或者多個BeanDefinitionParser的實現(xiàn)(關鍵步驟).注冊上述的schema和handler。在resources/META-INF/?錄下?創(chuàng)建spring.handler?件輸?:http\:///schema/demo=xsd.DemoNameSpaceHandler復制代碼,這?步將我們之前的標簽的url映射到我們NamespaceHandler。再創(chuàng)建?個spring.schemas?件,輸?:http\://www.demo.me/schema/demo/demo.xsd=META-INF/demo.xsd復制代碼這?步將xsd的url進?了映射?;氐阶⒔?,?家配置注解的時候?般都是使?下圖進?配置:但是可以看見其依然是使?XMLschema擴展進?處理,在Spring中有個叫ContextNamespaceHandler,注冊很多解析器:其中有?個解析器是compnent-scan,在他的parse?法中定義了如何進?注解掃描,獲取注解:利?這個擴展機制的還有AOP,MVC,Spring-Cache以及我們的?些開源框架?如Dubbo等。BeanFactoryPostProcessor擴展這個機制可以讓我們在真正的實例化Bean之前對BeanDefinition進?修改。這?我舉例?個實戰(zhàn)的例?,想必?家很多都配置過數(shù)據(jù)庫連接池吧,這?拿Druid來舉例:然后我們創(chuàng)建?個perties輸?:url=jdbc:mysql://localhost:3306/testusername=rootpassword=123456復制代碼對于這種配置??玩玩已經(jīng)滿?,但是在公司有個問題,密碼放在項?中明碼存儲,這樣是不?的,別?只要獲得了你項?的查看權限那么密碼就會被泄漏,所以?般的公司會有?個統(tǒng)?的密碼存儲服務,只有?夠的權限才能夠使?,那么我們可以把密碼放在統(tǒng)?存儲服務中,通過對服務的調(diào)?才能進?密碼的使?,那么我們怎么把從遠程服務中獲取到的密碼注?到我們Bean中呢?那么就要使?我們的BeanFactoryPostpRrocessor,下?的代碼繼承PropertyPlaceholderConfigurer(BeanFactoryPostpRrocessor的實現(xiàn)類):在XML中有:通過這種?式我們可以有?個好處:設置統(tǒng)?配置中?,那么我們不需要修改我們項?中的?件,只需要在配置中?頁?中修改即可。設置統(tǒng)?密碼中?,那么我們不需要暴露明?在項?中,密碼如何保護那么就直接丟給密碼中?即可。2.2Bean的創(chuàng)建?般我們在API中獲取?個Bean都會如下操作:通過GetBean操作進?獲取,前?我們講到過如果是?延遲加載的單例Bean那么會在容器刷新的時候進?加載,如果是延遲加載的Bean那么會在我們獲取Bean的時候根據(jù)BeanDefinition進?加載。?先在AbstractBeanFactory有兩個?法?個是doCreate,?個是create?來描述如何創(chuàng)建?個Bean。這?說?下單例Bean是如何創(chuàng)建的:doCreateBean操作流程如下圖:可以看見真正的創(chuàng)建bean的操作在CreateBean中,對于真正的創(chuàng)建Bean有如下流程:。2.2.1Aware接?Spring提供了很多Aware接??于進?擴展,通過Aware我們可以設置很多想設置的東西:invokeAwareMethod提供了三種最基本的Aware,如果是ApplicationContext的話那么在ApplicationContextAwareProcessor?進?了?輪Aware注?。BeanNameAware:如果Spring檢測到當前對象實現(xiàn)了該接?,會將該對象實例的beanName設置到對錢對象實例中。會將加載當前Bean的ClassLoader注?進去。BeanFactoryAware:將當前BeanFactory容器注?進去。BeanClassLoaderAware:如果使?ApplicaitonContextEnvironmentAware:將上下?中Enviroment注?進去,?般獲取配置屬性時可以使?。將上下?中EmbeddedValueResolver注?進去,?般?于參數(shù)解析。ResourceLoaderAware:將上類型的容器的話?會有下??種:EmbeddedValueResolverAware:下?設置進去。ApplicationEventPublisherAware:在ApplicationContext中實現(xiàn)了ApplicationEventPublisher接?,所以可以將??注?進去。MessageSourceAware:將??注?。ApplicationContextAware:這個是我們見的?較多的,會將??容器注?進去。2.2.2BeanPostProcessor在前?我們說過BeanFactoryPostProcessor,這兩個名字很像,BeanFactoryPostProcessor是?來對我們BeanFactory中的BeanDefinition進?處理,此時Bean還未?成。?BeanPostProcessor?來對我們?成的Bean進?處理。在BeanPostProcessor分為兩個?法,?個是?于初始化前置處理,?個是初始化?于后置處理。有?種特殊的BeanPostProcessor,InstantiationAwareBeanPostProcessor,其會在我們實例化流程之前,如果實現(xiàn)了這個接?,那么就會使?其返回的對象實例,不會進?后續(xù)流程。實戰(zhàn):BeanPostProcessor有什么?呢?如果你有?個需求,打點項?中?法每個?法的運?時常,你很容易想到?AOP去做,如果不?AOP的話那么你可以使?BeanPostProcessor的后置處理?法,將對應的每個Bean都進?動態(tài)代理。2.2.3InitializingBean/init-methodSpring提供了我們對Bean進?初始化邏輯的擴展:實現(xiàn)InitalizingBean接?:在afterPropertiesSet()通過xml?式:?法中我們可以寫?我們的初始化邏輯。在init-method中定義了我們初始化?法。2.2.4DisposableBean/destory-method俗話說,?與死輪回不?。那么我們有了?的擴展,?然Spring提供了死的擴展。我們也可以通過下?兩個擴展來實現(xiàn)我們銷毀的邏輯:DisposableBean:實現(xiàn)DisposableBean接?實現(xiàn)destroy?法即可。實現(xiàn)XML:在destroy-method中定義銷毀?法。PS:在我們Spring容器中如果要在JVM關閉時?動調(diào)?關閉的?法那么我們可以((ClassPathXm

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論