servlet为什么要别名呢_学习笔记18-servlet、tomcat、mybatis

Servlet部分源码分析:

a64516081fc059ec6bec6b4d961890b7.png
Servlet 和 ServletConfig 都是顶层接口,而 GenericServlet 实现了这两个顶层接口,然后HttpServlet 继承了 GenericServlet 类.所以要实现一个 Servlet 直接就可以继承 HttpServlet

将源码复制到某个Java文件中,去掉注释,加上自己的注释。

Servlet接口:

fdd3d52d40bac04cead6ddd2b58d45ad.png
init 方法接收一个 ServletConfig 参数,由容器传入.ServletConfig 就是 Servlet 的配置,在web.xml 中定义 Servlet 时通过 init-param 标签配置的参数由 ServletConfig 保存

ServletConfig接口:

af26caa69000668fb0a4a4959257ddc2.png
ServletConfig 是 Servlet 级别,而 ServletContext 是全局的

GenericServlet抽象类:GenericServlet是Servlet的默认实现,是与具体协议无关的

部分方法如下:

a1e14821772d3d145ceebbbc804974e8.png

3855d805f2e97aeedfd6fd9e43901fa7.png

ffa1c8fde118dc9bab9edbd313ad5fee.png

107327d339f9b9744b4588f4bd675569.png

a909be6a9db207cf1c3fbfa500076b78.png

HttpServlet抽象类源码较多,而且没有特别难以理解的东西,所以源码就不贴上来了。HttpServlet是基于Http协议实现的Servlet基类,我们在写Servlet的时候直接继承它就行了。SpringMVC中的前端控制器DispatchServlet 就是继承了 HttpServlet。HttpServlet 重写了 service 方法,而service 方 法 首 先 将 ServletRequest 和 ServletResponse 转成HttpServletRequestttpServletRequest 和HttpServletResponse,然后根据 Http 不同类型的请求,再路由到不同的处理方法进行处理。

tomcat架构图:

61bd6b4b651ab0346080950f2dd50abc.png

Server:服务器的意思,代表整个tomcat服务器,一个tomcat只有一个Server。Server中包含至少一个Server组件,用于提供具体服务。这个在配置文件中也得到很好的体现(port="8005" shutdown="SHUTDOWN" 是指在8005端口监听到"SHUTDOWN"命令,服务器就会停止)。

Service:Server中的一个逻辑功能层,一个Server可以包含多个Service。Service接收客户端的请求,然后解析请求,完成相应的业务逻辑,然后把处理后的结果返回给客户端,一般会提供两个方法,一个start打开服务Socket连接,监听服务端口,一个stop停止服务释放网络资源。

Connector:连接器,是Service中的核心组件之一,一个Service可以有多个Connector,主要是连接客户端请求,用于接收请求并将请求封装成Request和Response,然后交给Container进行处理,Container处理完之后再交给Connector返回给客户端。

Container:Service的核心组件之一,按照层级有Engine、Host、Context、Wrapper四种,一个Service只有一个Engine,主要作用是执行业务逻辑。

Engine:一个Service中只有一个Engine,Engine表示整个Servlet引擎,一个Engine下可以包含多个Host,即一个tomcat实例可以配置多个虚拟主机,默认情况下在server.xml文件中有<Engine name="Catalina" defaultHost="localhost">定义了一个名为Catalina的Engine。一个Engine包含多个Host的设计,使得一个服务器实例可以承担多个域名的服务。

Host:代表一个站点,也可以叫做虚拟主机,一个Host可以配置多个Context,在server.xml文件中的默认配置为<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">,其中appBase=webapps,也就是webapps目录,unpackingWARs=true属性指定在appBase指定的目录中的war包都自动解压,autoDeploy=true属性指定对加入到appBase目录的war包进行自动部署,一般用来做热部署操作。

Context:代表一个应用程序,就是日常开发中的web程序,默认配置下webapps下的每一个目录都是一个应用,其中ROOT目录中存放主应用,其他目录存放别的子应用,而整个webapps是一个站点。

tomcat启动流程:tomcat的启动流程非常标准化,入口是BootStrap,统一按照生命周期管理接口(Lifecycle)的定义进行启动,首先调用init()方法逐级初始化,接着调用start()方法进行启动,同时每次调用伴随着生命周期状态变更事件的触发。

c6bd4abcdd6f59e571a9efdad200d495.png

启动文件分析:一般启动tomcat执行的是startup.bat 或者startup.sh文件,在该文件中有着许多配置等信息,以我所使用的tomcat为例

startup.sh:

d9b97e7bf0648dad202c8d896c2ae646.png
启动startup.bat最终启动的是catalina.bat所以使用catalina.sh start命令和直接执行startup.sh是一样的

catalina.sh:由于这个文件中代码较多,只截取所需要的,即BootStrap这部分

5c0d0be7c28c2d9bd0967c2534e6bfa4.png
启动catalina.bat文件最终找到的是BootStrap文件,在同级目录(bin)下,可以看到有个jar包叫bootstrap.jar

64a0596919143922889ccdf11cd46ac1.png

main方法是整个tomcat启动时的入口,在main方法中使用bootstrap.init()方法来初始化类加载器和创建Catalina实例(使用反射创建),然后启动Catalina线程。

Catalina:

---Lifecycle接口:提供一种统一的管理对象生命周期的接口,通过Lifecycle、LifecycleListener、LifecycleEvent,Catalina实现了对tomcat各种组件,容器统一的启动和停止的方式。

---load方法:解析server.xml配置文件,并加载Server、Service、Container、Connector、Engine、Host、Context、Wrapper等一系列的容器,加载完成后,调用initialize()来开启一个新的Server。

---Digester类:解析server.xml文件,这个类相当于一个解析类,解析得到容器的配置。

---demon.start()方法:会调用Catalina的start()方法。

Mybatis:

d1570d19577636aea1fce068af3924c0.png
mybatis执行流程

配置文件:

---Properties(属性):将数据库连接参数单独配置在db.properties中,放在类路径下,这样只需要在配置文件中加载db.properties额属性值,这样避免了硬编码,可以将参数统一管理。

db.properties:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=929926

17e897b80c3b76f43a0e1f167d56e587.png
properties标签,加载db.properties 配置文件

settings(全局配置参数):可以进行一些设置:

8c69a97d5fc47c06ea534cc7533848c0.png

tpyeAliases(类型别名):是Java类型名字的一个别名,用来减少类全限定类名的多余部分

bbec4e3152702ee48b76df08f93bdaa7.png
没有配置别名

配置别名:

4dc19248f87eab7d8fb8dfcfe8b4fb2a.png

79d47218a1c4414c801d7dfa75ee3c41.png

plugins(插件):可以用来进行一些分页等插件的配置

81936de31efe169e065814ae28dcf0c0.png

environments(环境集合属性对象):

d14e1b87cce477875d9468520c10e773.png
transactionManager(事务管理):有两种JDBC或者MANAGED、DataSource(数据源):三种POOLED(池连),UNPOOLED(非池连),JNDI

mappers(映射器):指定映射配置文件

f6ffade9b20b6eeb9d64d0f7d11d2466.png

351d87704eb068ed3ecd652766ba6ddf.png

55bc368f3531eae6925598349fbae10d.png

mapper.xml:映射文件,定义了操作数据库的SQL,每个SQL是一个statement,映射文件是mybatis的核心。

---ResultMap:如果查询到的列名和实体类中定义的属性名不一致,可以通过定义resultMap对列名和属性名之间作一个映射关系。

4465ad13cb79f3870c79585901964c7d.png

cache:开启二级缓存,默认情况下一级缓存开启,二级缓存不开启

b2292d0e6ddf98f5328e76303f89ce45.png

select:查询语句

......

SQL:可重用的SQL语句块

Resources:工具类,

a108435424fb42e5d97023486aae11cb.png

例如:

8e60017f8247323c786472b530e50a6d.png

SqlSessionFactoryBuilder:是SqlSessionFactory的构件者类,首先调用XMLConfigBuilder类的构造器创建一个XML配置构建器对象,利用这个构建器对象调用器解析方法parse()来完成Configuration对象的创建,之后以这个配置对象为参数调用会话工厂创建者类中的build(Configuration config)方法来完成SqlSessionFactory(会话工厂)对象的构建。

885f22aac0c9ceeee34eef784963955b.png

XMLConfigBuilder:XML配置构建者类,通过XML配置文件来构建Configuration对象实例,构建的过程就是解析Configuration.xml配置文件的过程,期间会将从配置文件中获取到的指定标签的值逐个添加到之前创建好的默认Configuration对象实例中。

ec113faa36cedd67f1d1751a13a9c867.png
部分代码

Configuration:是MyBatis的上下文对象,实例化这个类的目的是为了使用其对象作为项目全局配置对象,这样通过配置文件配置的信息可以保存在这个配置对象中,而这个配置对象在创建好之后是保存在JVM的Heap内存中的,方便随时读取。

bf5d7a0fcf62fa7cc74e9c27c9d2aa47.png
部分代码

DefaultSqlSessionFactory:是SqlSessionfactory(会话工厂)的实现类,是真正生产会话的工厂类,这个类的实例的生命周期时全局的,只会在首次调用的时候生成一个实例(单例模式)。

72bfb8f4fad489e5cfddd855e8c39703.png

Executor:执行器接口,SqlSession会话是面向程序员的,而内部真正执行数据库操作的却是Executor执行器,Executor是和SqlSession绑定在一起的,每一个SqlSession都拥有一个新的Executor对象,由Configuration创建

f41b8d34c79114409e0b049b5eb5c498.png
Configuration类中的Executor相关方法

Executor继承结构:

f4b6eb1cf154b3e2a972028efb3072ac.png

a02a8a74b66706acbe931e299abc7230.png

f43d7839eb9fe2bd3e480d8ff9d5988a.png

BaseExecutor:

---SimpleExecutor:每执行一次update或者select,就开启一个Statement对象,用完立刻关闭。

a38c1f654d712dca4e3d3b5ab76af0d2.png

---ReuseExecutor:执行update或者select,以SQL作为key查找Statement对象,存在就使用,不存在就创建,用完之后不关闭Statement对象,而是放置于Map<String,Statement>中,供下一次使用。

e05ad2bf3d80118a10c5a0b03606342a.png

---BatchExecutor:执行update(JDBC批处理不支持select),将所有SQL都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕之后的,等待逐一执行。

3360c8c474dce27bfa6cfa131b9b35bf.png

CachingExecutor:先从缓存中获取查询结果,存在就返回,不存在就委托给Executor delegate去数据库中取,delegate可以是SimpleExecutor、ReuseExecutor、BatchExecutor。

31a12714e6d92ecd2c438835c20d7db5.png

StatementHandler:是Statement处理器,封装了Statement的各种数据库操作方法execute()。

RoutingStatementHandler:是一个封装类,不提供具体的实现,只是根据Executor的类型,创建不同的类型的StatementHandler。

ResultSetHandler:结果集处理器,如果是查询操作,必定会有返回结果,针对返回结果的操作,就要使用ResultSetHandler来进行处理,这个是由StatementHandler来进行调用的,这个处理器的作用就是对返回结果进行处理。

mybatis运行原理:运行过程中涉及到的类或者接口

---Resources(C):用于加载MyBatis核心配置文件

---XMLConfigBuilder(C):用于解析XML文件(核心配置文件)

---Configuration(C):用于存放xml文件解析后的结果

---DefaultSqlSessionFactory(C):是SqlSessionFactory(I)的实现类,创建时需要使用Configuration对象

---SqlSession(I):是MyBatis操作的核心

---DefaultSqlSession(C):是SqlSession接口的实现类

---TransactionFactory(I):用于产生Transaction对象

---Transaction(I):用于表示操作数据库的事务对象

---Executor(I):是MyBatis的核心执行器,类似于jdbc中的statement,常用的实现类为SimpleExecutor。

原理:

---当MyBatis开始运行时,先要通过Resources加载核心配置文件,之后使用XMLConfigBuilder对配置文件进行解析,将解析结果封装为Configuration对象,之后使用Configuration对象构建一个DefaultSqlSessionFactory对象,到此SqlSession工厂构建完成。

---之后,通过工厂对象调用openSession()方法创建SqlSession对象,在这个过程中,需要通过TransactionFactory生产Transaction对象,并且,还需要创建核心执行器Executor对象,之后,通过这些对象来创建DefaultSqlSession对象,到此SqlSession对象创建成功。

---之后,通过SqlSession对象执行相应的操作,如果执行成功,调用commit()方法提交事务,如果失败,调用rollback()方法回滚事务,最后,调用close()方法关闭session资源。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值