怎么做软文代发平台网站,凡科官网app下载,如何自己创建网站,卖酒网站排名大家好#xff0c;我是柳岸花开。今天我们要讲的是 Spring 整合 MyBatis 的底层源码解析。希望大家能更深入理解 Spring 和 MyBatis 的整合原理#xff0c;并应用到实际项目中。 由很多框架都需要和Spring进行整合#xff0c;而整合的核心思想就是把其他框架所产生的对象放到… 大家好我是柳岸花开。今天我们要讲的是 Spring 整合 MyBatis 的底层源码解析。希望大家能更深入理解 Spring 和 MyBatis 的整合原理并应用到实际项目中。 由很多框架都需要和Spring进行整合而整合的核心思想就是把其他框架所产生的对象放到Spring容器中让其成为Bean。 Mybatis框架可以单独使用而单独使用Mybatis框架就需要用到Mybatis所提供的一些类构造出对应的对象然后使用该对象就能使用到Mybatis框架给我们提供的功能和Mybatis整合Spring就是为了将这些对象放入Spring容器中成为Bean只要成为了Bean在我们的Spring项目中就能很方便的使用这些对象了也就能很方便的使用Mybatis框架所提供的功能了。 一、Spring 和 MyBatis 简介 Spring 一个开源框架提供全面的基础设施支持简化 Java 开发特别是在企业级开发中。 核心是控制反转IoC和面向切面编程AOP。 MyBatis 优秀的持久层框架支持自定义 SQL、存储过程及高级映射。 避免了大部分 JDBC 代码和手动设置参数及获取结果集的麻烦。 Mybatis-Spring底层源码执行流程 通过MapperScan导入了MapperScannerRegistrar类 MapperScannerRegistrar类实现了ImportBeanDefinitionRegistrar接口所以Spring在启动时会调用MapperScannerRegistrar类中的registerBeanDefinitions方法 在registerBeanDefinitions方法中注册一个MapperScannerConfigurer类型的BeanDefinition 而MapperScannerConfigurer实现了BeanDefinitionRegistryPostProcessor接口所以Spring在启动过程中时会调用它的postProcessBeanDefinitionRegistry()方法 在postProcessBeanDefinitionRegistry方法中会生成一个ClassPathMapperScanner对象然后进行扫描 设置ClassPathMapperScanner对象可以扫描到接口因为在Spring中是不会扫描接口的 同时因为ClassPathMapperScanner中重写了isCandidateComponent方法导致isCandidateComponent只会认为接口是备选者Component 通过利用Spring的扫描后会把接口扫描出来并且得到对应的BeanDefinition 接下来把扫描得到的BeanDefinition进行修改把BeanClass修改为MapperFactoryBean把AutowireMode修改为byType 扫描完成后Spring就会基于BeanDefinition去创建Bean了相当于每个Mapper对应一个FactoryBean 在MapperFactoryBean中的getObject方法中调用了getSqlSession()去得到一个sqlSession对象然后根据对应的Mapper接口生成一个Mapper接口代理对象这个代理对象就成为Spring容器中的Bean sqlSession对象是Mybatis中的一个sqlSession对象需要SqlSessionFactory来产生 MapperFactoryBean的AutowireMode为byType所以Spring会自动调用set方法有两个set方法一个setSqlSessionFactory一个setSqlSessionTemplate而这两个方法执行的前提是根据方法参数类型能找到对应的bean所以Spring容器中要存在SqlSessionFactory类型的bean或者SqlSessionTemplate类型的bean。 如果你定义的是一个SqlSessionFactory类型的bean那么最终也会被包装为一个SqlSessionTemplate对象并且赋值给sqlSession属性 而在SqlSessionTemplate类中就存在一个getMapper方法这个方法中就产生一个Mapper接口代理对象 到时候当执行该代理对象的某个方法时就会进入到Mybatis框架的底层执行流程。 Spring整合Mybatis后一级缓存失效问题 Mybatis中的一级缓存是基于SqlSession来实现的所以在执行同一个sql时如果使用的是同一个SqlSession对象那么就能利用到一级缓存提高sql的执行效率。 在Spring整合Mybatis后如果执行某个方法时该方法上没有加Transactional注解也就是没有开启Spring事务那么后面在执行具体sql时每执行一个sql时都会新生成一个SqlSession对象来执行该sql这就是我们说的一级缓存失效也就是没有使用同一个SqlSession对象而如果开启了Spring事务那么该Spring事务中的多个sql在执行时会使用同一个SqlSession对象从而一级缓存生效。 Spring整合Mybatis后一级缓存失效并不是问题是正常的实现因为一个方法如果没有开启Spring事务那么在执行sql时候那就是每个sql单独一个事务来执行也就是单独一个SqlSession对象来执行该sql如果开启了Spring事务那就是多个sql属于同一个事务那自然就应该用一个SqlSession来执行这多个sql。所以在没有开启Spring事务的时候SqlSession的一级缓存并不是失效了而是存在的生命周期太短了执行完一个sql后就被销毁了下一个sql执行时又是一个新的SqlSession了。 总结 今天我们深入解析了 Spring 和 MyBatis 整合的核心组件及其底层实现原理。希望大家通过这次课程能够对 Spring 和 MyBatis 有更深入的理解并能在实际项目中灵活运用。 关注我下期了解 Spring AOP底层源码解析 回复 222获取Java面试题合集 关于我 一枚爱折腾的Java程序猿专注Spring干货。把路上的问题记录下来帮助那些和我一样的人。 好奇心强喜欢并深入研究古天文。 崇尚 个人系统创建做一些时间越长越有价值的事情。思考 把时间留下来 又 每刻都是新的。