基于spring boot 提供的自动装配的能力,mybatis也有想要的自动装配形式。在浅谈mybatis自动装配前我们先了解一下以前我们是在xml如何配置的。
![1de6234ffd340f01e95661799aad784b.png](https://i-blog.csdnimg.cn/blog_migrate/441ffe2faf25b0b8dabfc4cade615de3.jpeg)
![729f3644ee2b9b31f68426af53f3de7f.png](https://i-blog.csdnimg.cn/blog_migrate/bf9f75de997a58a24be880506de904dc.jpeg)
上述是简单的一个数据源和mybatis配置,当然我们也可以通过代码进行配置,例如
![e29b64eae0692b173786cb1bee73d25a.png](https://i-blog.csdnimg.cn/blog_migrate/14fb99c80fc43c41056f64830276c4f5.jpeg)
在cmallSqlSessionFactory中配置SqlSessionFactory,这里和配置xml的形式是一样的。
![ffd3efa6a039e8f07fc4254be5236126.png](https://i-blog.csdnimg.cn/blog_migrate/adfe81393651e1808ce8b2a646f4c047.png)
那么mybatis的自动配置呢?我们需要引入mybatis-spring-boot-starter,我们发现依赖了mybatis-spring-boot-autoconfigure,我们打开jar包可以看到类不多。
![69561d491c5e4f84143f7d9baae3091c.png](https://i-blog.csdnimg.cn/blog_migrate/49a5c7a399f1b6a3e3580338c0c1c42c.jpeg)
我们先看MybatisAutoConfiguration头部有哪些注解:
![f5d7b0d0e6033b0f76ee210ed4bb3b21.png](https://i-blog.csdnimg.cn/blog_migrate/87bd415f57c37567473fd7a42384346d.png)
@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class }):当前classpath路径下面是否存在SqlSessionFactory.class, SqlSessionFactoryBean.class这两个类,存在则进行将当前配置装载到spring容器中。
@ConditionalOnBean(DataSource.class):当当前上下文中有DataSource实例的时候才将当前配置装载到spring容器中。
@AutoConfigureAfter(DataSourceAutoConfiguration.class):这个配置装载在DataSourceAutoConfiguration配置装载之后。
![ccb4d0e386e4458ae08f4bcc45bcd019.png](https://i-blog.csdnimg.cn/blog_migrate/7876dea95e98498ef6d09b7db83a7235.jpeg)
MybatisAutoConfiguration 的构造方法中我们关注一下拦截器(interceptors),它会去检索实现org.apache.ibatis.plugin.Interceptor的所有实现。例如pageHelper插件中实现了Interceptor。但是需要注意这个拦截器是否被SqlSessionFactory给装载,图2是在当上下文中不存在SqlSessionFactory 的Bean是会自动生成一个,同时将配置信息装载进去。那么如果SqlSessionFactory因某种原因(例如我们代码配置构建完成了SqlSessionFactory)构建完成,那么MybatisAutoConfiguration就不会去帮我们去处理图2,那么这些装载工作可能需要我们去自己完成,例如我们需要将pagerHelper的拦截插件构建到SqlSessionFactory。当然了pagerHelper为了降低成本,也会提供相应的装配,不用我们去关注这个装配,只需要我们实现拦截业务即可。
![778488d1d72f26224fcca983c8fca9b1.png](https://i-blog.csdnimg.cn/blog_migrate/123248deb0af3b5f4da10e29b9ce2972.jpeg)
其实装配和xml配置是很相似的,我们只要了解当前步骤需要加载相应的bean,bean又操作了哪些事情。我们就可以分析出问题。