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