自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(10)
  • 收藏
  • 关注

原创 Tomcat 的启动化过程分析(一)

Tomcat 的架构Tomcat 在启动过程前,会先进行初始化,通过解析 server.xml 来创建一个多层的容器。这个容器由多个组件组成,以 server.xml 为例,这个 xml 文件包含了要启动的各组件。<Server> <Service> <Connector /> <Connector /> <Engine> <Host>

2020-08-09 15:06:43 135

原创 Spring 循环依赖的产生及解决方案的分析

循环依赖的产生以下面代码为例,A 依赖 B,B 依赖 A。@Componentpublic class A { private B b; public void setB(B b) { this.b = b; }}@Componentpublic class B { private A a; public void setA(A a) { this.a = a; }}Spring 发现 A 对象,实例化 A,但没有放到 Spring 对象池(一级缓

2020-08-09 16:14:09 622

原创 Mybatis 的插件运行原理

Mybatis 插件运行原理Mybatis 中的四大对象 Executor、ParameterHandler、ResultSetHandler、StatementHandler 都是代理对象。如下代码,在创建时会调用 interceptorChain.pluginAll() 方法,遍历调用 plugin 方法判断是否返回目标对象本身,还是进行拦截返回代理对象。 如果拦截返回代理对象的话,之后调用时,会调用代理对象的拦截方法 intercept 进行拦截增强,从而实现调用插件。这与 RPC 客户端在调用

2020-08-09 16:07:58 421

原创 MyBatis 的一、二级缓存的区别及源码分析

一级、二级缓存区别存储结构, 一级缓存是存在内存 Map 中。二级缓存存储介质多样,可在内存、硬盘中,需要进行序列化和反序列化;范围, 一级缓存是 sqlSession 级别的缓存,二级缓存是跨 SqlSession 的;失效场景, 一级、二级缓存都是在执行插入、更新、删除时会失效,需要重新从数据库获取,避免脏读。另外一级缓存不能用于分布式场景,二级缓存需要使用 redis 来实现;一级缓存在开启一次数据库会话中,如果执行多次相同的查询 SQL,MyBatis 在第二次执行时会将从缓存中直接获

2020-08-09 16:05:57 217

原创 MyBatis 的 Executor 结构分析

Executor 结构如下图,Executor 的默认实现类为 BaseExecutor,实现 Executor 接口的大部分功能。BaseExecutor,Executor 接口的默认实现类,实现 Executor 接口的大部分功能;ClosedExecutor,已关闭的 Executor;CachingExecutor,支持二级缓存的 Executor 的实现类。先从缓存中查询结果,存在就返回。否则会给一级缓存执行器(BatchExecutor、ReuseExecutor、SimpleExe

2020-08-09 16:04:04 135

原创 动态 SQL 的概念、种类及分析

动态 SQL 概念顾名思义,SQL 是动态拼接成的,根据传入的变量值进行逻辑操作,并动态拼接,方便实现多条件下的数据库操作。 在业务逻辑复杂,即简单 SQL 无法完成时,需要拼接时就要使用动态 SQL。  以查询为例,会先判断 id 是否不为 0,如果不为 0,才会传入该占位符对应的 id 值。假设 id = 2333,即 “select * from User id = 2333”。如果为 0,则为 “select * from User”。<select id = "findByCondit

2020-08-09 16:02:10 3795 1

原创 动态代理实现 MyBatis 的延迟加载

MyBatis 的延迟加载MyBatis 是支持延迟加载,又叫懒加载。先查询主要信息,在按需去查询其他信息。即需要时加载查询,不需要时就不加载查询。使用延迟加载的目的是减轻数据库的压力,只有需要时才去查询。   举例,如下没使用延迟加载的话,就会两张表都查询,查出 orders 和 users 的信息,在拼接成一块。SELECT orders.*, users.username FROM orders, users WHERE orders.user_id = users.id-- 延迟加载相当于

2020-08-09 15:58:33 355

原创 Tomcat 的启动化过程分析(四)

Bootstrap#start使用反射,调用 Catalina.start() 方法。 public void start() throws Exception { if (catalinaDaemon == null) { init(); } Method method = catalinaDaemon.getClass().getMethod("start", (Class [])null); // 调用

2020-08-09 15:14:58 201

原创 Tomcat 的启动化过程分析(三)

Bootstrap#load使用反射调用 Catalina 实例的 load 方法,即 Catalina.load()。 private void load(String[] arguments) throws Exception { // Call the load() method String methodName = "load"; Object param[]; Class<?> paramTypes[];

2020-08-09 15:11:50 130

原创 Tomcat 的启动化过程分析(二)

Bootstrap#init主要是通过反射创建实例 Catalina,用于调用 Catalina.load() 方法。initClassLoaders(),初始化、创建类加载器,比如 catalinaLoader;使用类加载器 catalinaLoader,加载并实例化 Catalina,使用变量保存 Catalina 实例。 public void init() throws Exception { // 初始化、创建类加载器 initClassLoad

2020-08-09 15:09:10 105

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除