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

原创 Tomcat 的启动化过程分析(一)
Tomcat 的架构 Tomcat 在启动过程前,会先进行初始化,通过解析 server.xml 来创建一个多层的容器。这个容器由多个组件组成,以 server.xml 为例,这个 xml 文件包含了要启动的各组件。 <Server> <Service> <Connector /> <Connector /> <Engine> <Host>
2020-08-09 15:06:43
170
原创 Spring 循环依赖的产生及解决方案的分析
循环依赖的产生 以下面代码为例,A 依赖 B,B 依赖 A。 @Component public class A { private B b; public void setB(B b) { this.b = b; } } @Component public class B { private A a; public void setA(A a) { this.a = a; } } Spring 发现 A 对象,实例化 A,但没有放到 Spring 对象池(一级缓
2020-08-09 16:14:09
687
原创 Mybatis 的插件运行原理
Mybatis 插件运行原理 Mybatis 中的四大对象 Executor、ParameterHandler、ResultSetHandler、StatementHandler 都是代理对象。 如下代码,在创建时会调用 interceptorChain.pluginAll() 方法,遍历调用 plugin 方法判断是否返回目标对象本身,还是进行拦截返回代理对象。 如果拦截返回代理对象的话,之后调用时,会调用代理对象的拦截方法 intercept 进行拦截增强,从而实现调用插件。这与 RPC 客户端在调用
2020-08-09 16:07:58
469
原创 MyBatis 的一、二级缓存的区别及源码分析
一级、二级缓存区别 存储结构, 一级缓存是存在内存 Map 中。二级缓存存储介质多样,可在内存、硬盘中,需要进行序列化和反序列化; 范围, 一级缓存是 sqlSession 级别的缓存,二级缓存是跨 SqlSession 的; 失效场景, 一级、二级缓存都是在执行插入、更新、删除时会失效,需要重新从数据库获取,避免脏读。另外一级缓存不能用于分布式场景,二级缓存需要使用 redis 来实现; 一级缓存 在开启一次数据库会话中,如果执行多次相同的查询 SQL,MyBatis 在第二次执行时会将从缓存中直接获
2020-08-09 16:05:57
261
原创 MyBatis 的 Executor 结构分析
Executor 结构 如下图,Executor 的默认实现类为 BaseExecutor,实现 Executor 接口的大部分功能。 BaseExecutor,Executor 接口的默认实现类,实现 Executor 接口的大部分功能; ClosedExecutor,已关闭的 Executor; CachingExecutor,支持二级缓存的 Executor 的实现类。先从缓存中查询结果,存在就返回。否则会给一级缓存执行器(BatchExecutor、ReuseExecutor、SimpleExe
2020-08-09 16:04:04
194
原创 动态 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
4086
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
448
原创 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
266
原创 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
168
原创 Tomcat 的启动化过程分析(二)
Bootstrap#init 主要是通过反射创建实例 Catalina,用于调用 Catalina.load() 方法。 initClassLoaders(),初始化、创建类加载器,比如 catalinaLoader; 使用类加载器 catalinaLoader,加载并实例化 Catalina,使用变量保存 Catalina 实例。 public void init() throws Exception { // 初始化、创建类加载器 initClassLoad
2020-08-09 15:09:10
141
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人