springboot实操笔记(二)
前面分别试了试spring-boot-starter-web,spring-boot-starter-data-jpa
这里再来试试:mybatis-spring-boot-starter。 从名字来看我会感到有点奇怪,因为之前看到的都是spring-boot-starter-xxxx,但是这个却是xxxxx-spring-boot-starter。 而且使用中也能看到它们的区别:
加入如上的一些依赖,pom并没有不报错,但是奇怪的是怎么也导不进Jar依赖,查看idea的那个配置文件:
之后加上了版本号,就导入进来了。 我猜想这会不会说明一个问题,原生的或者默认的就用spring-boot-starter-xxxx,并且再spring-boot-starter-parent中或者说 spring-boot-starter-dependencies中指定了版本,而后天集成的就用 xxxx-spring-boot-starter,同时要自己指定版本号。 嗯一定是这样,哈哈。机智如我
看一下它导入的依赖,相对而言就要少很多了:
虽然它的内容相对要少一些,但是却必须重点看一下。 为什么呢? 想一想,它可是作为一个备胎上位,将默认的jpa的实现hibernate给干掉的,怎么能够小看!
所以它们之间是如何解耦,如何实现这种相对友好的交接方式,是值得我们花时间专研的。
从它的结构看出,它是没有依赖spring-data的,至少表面上没有。
通过分析,可以发现它的关键点应该就在 mybatis-spring 上面。进去看看:
发现这个集成中间的类还是挺少的勒,有时间重点去看看。 同时也发现好像没有什么有价值的发现。 但是有个关键点类我给圈起来了。 通过看它的pom包中的依赖,感觉还是得去看看它本身才行:
可惜对mybatis本身也不熟悉,没办法下手。 既然这也那就只好报大佬大腿了。 去互联网上不难发现这样的贴子,其中有一个我已经关注的博主就写了篇非常不错的文章,这里引用一下它文中的部分内容,结合自己的理解,以期弥补自己知识的漏洞:
这是作为一个Mybatis产品单独使用时,不集成其它的东西,它的一个用法个例。 可以看出这里它所用到的类有: SqlSessionFactory,SqlSession,说白了就 SqlSession。 那么这里我想说一下自己的感受了: 比如tomcat,作为一个著名的开源的,稳定的servlet容器,它本身蕴含了复杂的设计模式,并且具有十分复杂的类结构关系,但是它任然有一个启动类: bootstrap.java,只是我们不是直接调用它,而是通过startup.sh或者 startup.bat调用,应为要做很多的初始化,环境检查之类的工作。 再比如今天所涉及的内嵌的tomcat,它也可以看作有一个启动类: Tomcat t = new Tomcat() ; 至于容器类各种复杂的调用则是后续的事情。 再比如我们看到一个十分复杂的软件,那我们拿到它的源码也是首先说去看它的主方法,即main方法。 这个地方呢也是如此,我们通常称作Mybatis,但是它具体的用法从哪开始呢? 这就是一个例子。 理解了这个,对集成的理解应该会好一些。
看看集成了Spring的例子:
前面说到,单用mybatis的时候,核心甚至说启动类其实就是SqlSession。 上两张图贴的分别是spring集成的配置文件以及spring继承后的测试类。 第一图核心中的核心便是红色框内容的内容:org.mabaits.spring.mapper.MapperFactoryBean。 有几点需要明确:
它是一个泛型类;
它将SqlSession给包装了;
它的泛型类的核心方法的返回值应该是本身的泛型类;
它的泛型类的泛型提供者从内部成员中进行获取。
因此它的测试类长成这样也就不奇怪了。 因此 我们springboot开发时用的@Mapper,之后,可以通过接口映射xml,最后实现数据库存储就不奇怪了。 感情用了这么久,原来数据库存储这块一直是ORM框架负责。 妙哉妙哉!
顺便看看它的源码的外形,过把瘾:
同时看看sqlSessionFactoryBean过把瘾:
不过这好像偏离了原来的的轨道。 我是想研究它们怎么解耦,然后怎么对接来着。
但是现在有一些模糊的认识了,并且将之前的知识刷新了一些:谈谈自己的理解把:
1.不是所有的东西与spring 或者说spring-boot都叫集成,比如 spring-data,spirng-boot-data-jpa,spring-boot-starter-web。有一些是它自带的默认的功能,还是不要叫集成好点。
2.若是spring与mybatis集成,那么只是引入jar包应该不配置相关的bean,应该是不会报错的。 hibernate也一样。 但是springboot由于是约定优于配置,因此当我们将mybatis依赖导入,不进行配置的话,会报错。 这给我们解耦提供了一个思路,若要解开spring-boot与某个产品的集成,若是标准的pom依赖,则直接去出它相应的xxxx-spring-boot-starter即可。
3.spring-boot与其它产品的集成是基于spring的。
4.那么springboot最吸引人的,也是最神奇的应该就是自动配置那段了吧。 (我有这样的一些疑惑: 它怎么知道哪些需要装配,如何知道装配的依赖关系,根据什么标准去装配) 。
有些累了,就这样吧!