- 博客(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关注的人