外观模式源码解析(springjdbc+myabtis+tomcat)
生活随笔
收集整理的這篇文章主要介紹了
外观模式源码解析(springjdbc+myabtis+tomcat)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
我們首先看一下外觀模式在SpringJDBC中的一些應(yīng)用,我們看一下JdbcUtils,為了更好理解,把外觀模式重新講了一下,用積分的場景,我們直接繼續(xù)看源碼,這個(gè)是spring.jdbc包下的,這個(gè)方法就是對JDBC方法進(jìn)行了封裝,我們在開發(fā)中直接使用即可,我們也不需要封裝自己的JDBC接口,因?yàn)镾pringJDBC已經(jīng)做了很好的封裝,我們直接down下源碼看一下,我們往下看一下,看到第一個(gè)方法,closeConnection,這里的入?yún)⑹荂onnection
這個(gè)連接對象我們看一下,它是屬于java.sql里面的,也就是說JDBCUtils,對Connection進(jìn)行了一個(gè)封裝,而里面的調(diào)用也是調(diào)用了JDBC原生的Connection,那接著往下看,closeStatement
這里面調(diào)用的也是Statement里面的方法,同理接著往下看,使用獲取結(jié)果集的數(shù)據(jù),用返回Object的對象,那就是JAVA原生的ResultSet,這里面還有一些其它參數(shù)
下邊就比較清晰了,首先在這里判斷類型
如果不是空的接著往下走,String類型,boolean,byte
各種類型的判斷呢,在這里面都能看到,包括BigDecimal
接著往下看,我們看一下這個(gè)方法,extractDatabaseMetaData,這里面的代碼的作用是根據(jù)DataSource,來獲取結(jié)果集中的數(shù)據(jù),入?yún)⑹荄ataSource,都是對原生的JDBC進(jìn)行了封裝
對于JDBC的封裝,在SpringJDBC中,是這樣的,在Hibernate中也是有的,我們接著看一下其他的框架中,如何使用外觀模式的,我們再看一下Mybatis中的一些應(yīng)用,在Mybatis中這個(gè)Configuration配置類,也使用了外觀模式,那我們看一下一些方法,newMetaObject,包括下面所有new開頭的方法
parameterHandler就是一些參數(shù)的轉(zhuǎn)換,還有結(jié)果集的一些Handler,Statement的Handler,那我們隨便找一個(gè)來看一下,比如newMetaObject,通過這樣封裝之后,我們客戶端都有相同的功能,這一組接口交給客戶端來訪問,那我們其他類需要使用這些對象的時(shí)候,都根據(jù)這個(gè)類里面的方法來創(chuàng)建,newMeataObject都有哪些調(diào)用者呢,這里面的調(diào)用者還是挺多的,都是調(diào)用configuration的newMetaObject方法來操作的,如果以后擴(kuò)展,需要變化的話,我們不需要修改調(diào)用者,這些都不用改,我們只要改這個(gè)方法,就可以了,非常好理解,那門面模式在TOMCAT中,也有非常好的應(yīng)用,首先我們訪問tomcat.apache.org然后把Tomcat源碼下載下來,https://tomcat.apache.org/download-90.cgi這里有source code我們直接下一個(gè)壓縮包public class RequestFacade implements HttpServletRequest我們通過名字也能夠看出來,它是一個(gè)Request的外觀類,他實(shí)現(xiàn)了HttpServletRequest,這個(gè)類正是HttpServletRequest的一個(gè)外觀類,那我們看一下這里面的方法,包括各種操作Request的一些方法,例如getParameter,這個(gè)小伙伴們非常熟悉,各種方法都在這里面,那么再看一下Request這個(gè)類,注意是catalina這個(gè)包下的,我們先來到這個(gè)類的最頭部public class Request implements HttpServletRequest 這個(gè)類是HttpServletRequest的子類,那這三個(gè)類都是什么關(guān)系呢,我們看看源碼,能更好的理解,Request和RequestFacade都實(shí)現(xiàn)了HttpServletRequest,我們可以認(rèn)為他們兩都是同級的,HttpServletRequest的子類,但是在Request里面我們看一下,我們找一下facade的聲明/*** The facade associated with this request.*/
protected RequestFacade facade = null;聲明在這里,也就是說Request里面聲明了一個(gè)RequestFacade,而具體從Request里面操作的時(shí)候呢,都是facade對象,例如getRequest,使用的也是這個(gè)外觀類,public HttpServletRequest getRequest() {if (facade == null) {facade = new RequestFacade(this);}if (applicationRequest == null) {applicationRequest = facade;}return applicationRequest;
}ResponseFacade和Response使用方式是一樣的,Request理解這個(gè)我們就理解了,public class ResponseFacade implements HttpServletResponse我們再看一個(gè)Session相關(guān)的,StandardSessionFacade,同理這個(gè)Facade外觀類呢,是處理HttpSession的,那在TOMCAT源碼里面,大量的使用外觀類,我們搜索一下,有很多facade結(jié)尾的類,都是在使用外觀模式,StandardWrapperFacade,StatementFacade,而這個(gè)Facade可以看到,是TOMCAT里面提供的,JDBC連接池,所以外觀模式應(yīng)用是非常廣泛的,就拿RequestFacade來說,Request通過RequestFacade包裝了這個(gè)Request類,因?yàn)镽equest和RequestFacade,都實(shí)現(xiàn)了HttpServletRequest,所以在獲取Request的時(shí)候,實(shí)際返回的是一個(gè)facade,因?yàn)樗麅啥际撬淖宇?而這個(gè)RequestFacade,內(nèi)部就可以根據(jù)需要進(jìn)行封裝,把具體的他認(rèn)為子系統(tǒng)的各種操作都封裝到RequestFacade這里邊,對外我們類似操作的是HttpServletRequest這個(gè)類,實(shí)際我們使用的是RequestFacade這個(gè)類,這里面我們要說一下,要下載TOMCAT源碼,在我們項(xiàng)目里是找不到這個(gè)類的,里面使用的是Servlet API,源碼是比較全的,比我們項(xiàng)目封裝起來的jar包要全很多,分析了這么多源碼呢,就是為了深刻理解外觀模式,也叫門面模式,包括我們在項(xiàng)目中的使用,還有在一些開源框架源碼中的使用
?
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的外观模式源码解析(springjdbc+myabtis+tomcat)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 外观模式coding
- 下一篇: 装饰者模式讲解