mybatis本地缓存阅读
😀 这里写文章的前言:一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 题记缓存这个知识点在许多地方都有的,利用到好的话,对系统的很多地方查询是有很大的提升的. 可以看到,MyBatis 也是有 cache 的,那MyBatis 是怎么利用这个缓存的呢? 在 INSERT/UPDATE/DELETE/SELECT中,是不是只有SELECT的时候用到了缓存,如果是 INSERT/UPDATE/DELETE 是否会对缓存有影响?可以看结果来分析,然后跟进源码来仔细分析.
MyBatis 是分为 一级缓存 和 二级缓存的. 那么,我们就先从一级缓存开始.
一级缓存案例代码 :
这里我们是打印的查询sql的语句,再第二次再查询的时候,是
InputStream mybatisInputStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessi ...
mybatis中mapper文件阅读
😀 这里写文章的前言:一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 题记MyBatis是如何对 Mapper 文件中的sql进行处理呢? 虽然上篇解析 mybatis-config.xml 是有进行说明的, 但是应该拿出来单独仔细解析下. 因为这个里面涉及到动态sql, 加上mapper文件自身也有很多标签内容,然后MyBatis是怎么读取出这些内容的呢?读取出来后,又是做了怎么样的处理, 然后达到了sql那种执行效果的呢?
意思也就是,Mapper + 动态sql , 内容还是有点多的, 并且也很重要, 是非常有必要拿出来单独的仔细讲解下的.
Target在之前对标签的进行解析的时候,是有对 标签进行一个初步的解析. 然后里面其实是很多内容还没填补很详细,所以特意记录下对 详细操作的. 那么,下文就开始操作吧.
org.apache.ibatis.builder.xml.XMLMapperBuilder#parse主要来看这段解析的代码 :
public void parse ...
mybatis中config-xml代码阅读
😀 这里写文章的前言:一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 题记对于配置文件的解析, 还是相对比较好理解的, 就是读取配置文件, 然后在代码需要的地方给使用到.
这里,可以扩展下, Spring / SpringBoot 等是怎么读取配置文件呢 ? 并且配置文件还是有 xml / properties/yaml 等格式的 , 其读取代码是怎么写的 ? 然后基于 阿波罗(携程开源) 的配置中心 , 其实现配置又是怎么实现的呢 ? 然后这里,看了 Mybatis 读取配置文件, 后续再出 Spring 配置文件的时候,如果二者读取配置进行对比, 你个人更倾向使用代码呢 ?
所以,这里就开启读取 Mybatis 是如何解析配置文件的操作.
配置文件这里的配置文件解读,是根据 MyBatis官网来一步一步的解析阅读. 如果有官网没有涉及到的,发现了也会在后续加上去的. 解析多行代码, 才能理解 何为优秀.
标签一 : propertiesorg.a ...
MyBatis工作流程分析
😀 这里写文章的前言:一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 MyBatis 的工程流程分析MyBatis 是我们在学习Java框架,也就是学习完JavaWeb的知识后,要学习到的一个ORM的框架. 我也是学习&使用过后,再次对源码进行阅读的. 所以这篇文章记录 MyBatis 的一个 work flow.
先放上项目地址 : https://github.com/baoyang23/mybtatis-analysis/tree/master/mybatis-work-flow
有兴趣的同学,可以clone下来看看.
代码案例先放上案列的代码, 然后我们可以挨个的分析
public class InitHelloMyBatis { public static void main(String[] args) throws IOException { // 读取配置文件. InputStream mybatisI ...
SpringBoot创建Web环境
😀 这里写文章的前言:一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 SpringBoot创建Web环境启动一个SpringBoot项目就相当于启动了一个web项目, 内嵌的tomcat, 那 SpringBoot是怎么启动这个代码的呢?
所以还是需要去看下其底层是怎么走的实现的.
方法org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext#onRefresh
当走 refresh 方法的时候, 如果只是单纯的Spring的话,那么这里就不会走到上面的子类.
如果是基于SpringBoot查看的代码,并且也引入了 web环境,那么走 refresh的之后,跟进 onRefresh 方法,就会走到这里来.
@Override protected void onRefresh() { super.onRefresh(); try { ...
SpringBoot中BeanPostProcessor
😀 这里写文章的前言:一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 SpringBoot中BeanPostProcessorBeanPostProcessor 是在Spring中实例化bean的时候使用到的,也是对bean的一种扩展. 理解好 BeanPostProcessor是对理解好 bean 的初始化是很重要的. 每种BeanPostProcessor都有各自不同的用途.
看下 BeanPostProcessor 这个接口,是只有 postProcessBeforeInitialization 和 postProcessAfterInitialization 这二种方法的,并且都是用 default来进行修饰,也就是实现这个接口的时候,可以实现其方法,也可以不用实现其方法的,这就是接口上的方法使用 default 来进行修饰的情况.
ApplicationContextAwareProcessor
WebApplicationContextServletContextAw ...
SpringBoot的run方法阅读
😀 这里写文章的前言:一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 SpringBoot 之 run 方法启动SpringBoot 无配置式启动,大大的减轻了以前需要配置很多xml中的bean/aop/事物等. 只需要使用@SpringBootApplication 和 SpringApplication.run() 方法就可以轻松的跑起来了. 想要看怎么这么神奇,就需要看其run() 方法的执行操作.
run() 方法又包含了之前分析的 refresh 方法,但是这里的refresh 方法是要比之前的 单独分析 Spring 的 refresh方法的内容要多得多.
run方法整体我们先看下 run 方法整体的流程. 其实也不难看出来, 也是new对象,调用方法. 但是人家可不仅仅是这二种就轻松搞定了的. 而且里面采用了大量的设计模式等知识.
从run 方法整体来看, 先是启动 StopWatch,然后获取出SpringApplicationRunList ...
SpringBoot构造方法阅读
😀 这里写文章的前言:一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 SpringBoot构造函数 SpringBoot可以说说目前Java人员都在使用的框架. 但是如果是仅仅停留在使用程度的话,那么还是比较可惜的.可以适当的阅读一下其底层代码是怎么实现的. 就其单Spring框架自身,阅读起来或者说是对其执行代码起来,还是需要大量的时间去理解的. 但是这不妨碍我们可以多阅读几遍,对其加强理解.
构造方法这是简单的启动一个 SpringBoot 项目. 这里先不看run方法,我们就先看这个 new SpringApplication 里面是怎么走的.
public static void main(String[] args) { SpringApplication application = new SpringApplication(BootSourceLearnApplication.class); ConfigurableApplic ...
SpringBoot初始化阅读
😀 这里写文章的前言:一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 SpringBoot 中 Initializer最近看 SpringBoot 源码,看源码这个这个东西是真的要细心, 当你看到觉得重要的东西的时候,就一定要仔细去看,代码的走向以及走到了那个类中. 只有掌握这些,接下来才会更好理解.
然后我今天在看的时候, org.springframework.boot.SpringApplication#prepareContext —> org.springframework.boot.SpringApplication#applyInitializers 当debug到这里的时候,就会看到 getInitializers() 方法返回的是一个集合,其中都是以Initializers 结尾的,并且都调用了相应的 initialize 方法. 所以就看下这个地方是要做写什么操作.
DelegatingApplicationContextInitializer
Sha ...
Spring扩展
😀 这里写文章的前言:一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 Spring扩展前面讲到了这么多的什么BeanPostProcessor,事件什么的. 如果不写几下代码这里怕是很难弄清楚是个怎么回事. 所以只有看到代码跑,就大致可以看到其效果还是很明显的.
BeanFactoryPostProcessor我们这里实现一下 BeanFactoryPostProcessor 来看一下效果
我们就写一个简单的类, 然后实现下接口 BeanFactoryPostProcessor, 我们这里就获取下 beanFactory中的所有beanDefinitionNames的数组,然后给打印出来看效果. 可以看下下面打印的接口. 然后我们看下源码怎么执行的
@Componentpublic class GavinYangBeanFactoryPostProcessor implements BeanFactoryPostProcessor { public void po ...

