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