牛逼哄哄的Spring是怎么被MyBatis给征服了?

其实前几篇文章已经写了好多有关于Spring源码的文章,事实上,很多同学虽然一直在跟着阅读、学习这些Spring的源码教程,但是一直都很迷茫,这些Spring的源码学习,似乎只是为了面试吹逼用,我大概问过一些同学,很多同学看了很长时间的Spring但是依旧不知道如何将这些学到的知识运用到实际的案例上!

其实这个问题很好解决,如果你在开发中很少能够遇见需要Spring扩展时,不妨把目光放到一些依托于Spring的项目,看看它们是如何运用Spring的扩展点的。对于Spring的学习,我认为最终真正学会的一定是在某一天,Spring本身功能不够,其他框架解决不了,你能够使用自身所学,扩展Spring的实现,从而完成一些特定的功能,我愿称之为!

一、你一定用到过的 MyBatis-Spring

我个人而言,是十分喜欢MyBatis的开发者的,为什么呢光是因为他的功能强大,更多的是因为其开发团队的!为什么这么说呢兴趣的小伙伴可以进入的MyBatis-Spring的源码中,你会发现一件事,MyBatis-Spring并不是由Spring进行开发的,而是MyBatis自己进行开发的!为什么呢一下官方的说法:

Spring 2.0 只支持 iBatis 2.0。那么,我们就想将 MyBatis3 的支持添加到 Spring 3.0 中(参见 Spring Jira 中的问题)。不幸的是,Spring 3.0 的开发在 MyBatis 3.0 官方发布前就结束了。由于 Spring 开发团队不想发布一个基于未发布版的 MyBatis 的整合支持,如果要获得 Spring 官方的支持,只能等待下一次的发布了。基于在 Spring 中对 MyBatis 提供支持的兴趣,MyBatis 区认为,应该开始召集有兴趣参与其中的贡献者们,将对 Spring 的集成作为 MyBatis 的一个 区子项目。

于是乎,MyBatis自己动手搞了一个Spring的扩展实现,呕吼!牛逼!

众所周知,MyBatis作为一个持久层框架它支持自定义 SQL、存储过程以及高级映射。通过xml映射到接口,使开发者使用接口的方式就能够轻松的映射、解析、执行xml中的sql!

但是,你想没想过一件事,MyBatis和Spring整合之后,里面的接口居然能够被Spring进行管理,然后通过 自动注入等Spring的注入手段进行注入! 有的同学可能没听明白,翻译过来就是,Spring原本只能够管理一个普通类,但是MyBatis只有一个接口,并没有实现类,Spring是如何进行管理的呢/p>

二、MyBatis如何对Spring进行扩展

1. 术语介绍

  • 这个类是干嘛的单来说,他可以创建一个自定义的然后手动的注册到Spring容器中去。
  • 他是Spring生命周期中一个重要的环节,阅读过之前文章的同学应该记得,Spring生命周期中,会将Class解析成然后注册在中, 然后在执行 之前执行这个类的回调,完整一些特定的功能,比如注册一波自定义的bd等操作!
  • 他是Spring内置的一个扫描器,可以扫描底层的class文件,从而最终完成从class文件到 的转换!

2.源码解析

使用过SpringBoot的同学都知道,如果想要MyBatis使用Spring的自动配置功能,都需要在启动类上加上一个,他也是今天的一个源码的重点!

我们先看一下注解究竟做了哪些事情!

这个注解通过向Spring注入了一个,我们进入到他里面看一下源码!

这一段代码最终的逻辑简单来说就是构建了一个自定义扫描器然后注册到Bean工厂中,他也就是前面术语项中说的的实现类,Spring声明周期中,会自动回调方法,进行一系列的操作。我们下一步就是进入到中看一下他做了哪些操作!

这一段代码主要是在Spring回调这个方法后,这个方法会构建一个扫描器,他是前面术语项中说到的的子类实现,然后调用 的方法,将扫描到的类转换成对应的注册到容器中,正常来说我们应该关注的是scan方法,但是但是,我们在看scan之前,应该重点的关注一下方法,我们大可看一下他做了哪些操作!然后再去看scan方法!

为什么要先看这个呢为对于Spring而言,他对一个有着很严格的校验,当扫描的类不符合预定的一些条件的时候,Spring就会把它丢弃掉,不会管理这个类,我们这个方法就是为了,让Spring在扫描到那些接口的时候,添加一些自定义的过滤器,使Spring能够识别我们预定的这些接口,然后转换成!

自定义的过滤器添加完毕后,我们就进入到scan方法去!


                                                        

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年7月21日
下一篇 2020年7月21日

相关推荐