外观模式源码解析(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包要全很多,

分析了这么多源码呢,就是为了深刻理解外观模式,也叫门面模式,包括我们在项目中的使用,还有在一些开源框架源码中的使用

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值