1.第一种方式: 加载mapperLocations指定路径下的xml
如果配置了mybatis.mapperLocations,那么会加载该属性配置的包下的xml。
mybatis.mapper-locations=classpath:mapper/*.xml
那么 这个配置就会被装载到 MybatisProperties这个类里
然后mybatis -springboot启动器 会通过spi 注册这个类MybatisAutoConfiguration,这个类里 有@EnableConfigurationProperties(MybatisProperties.class)注解,注册MybatisProperties类 去加载对应的配置信息,然后通过构造方法 的 参数注入,注入MybatisProperties对象,赋值给成员变量properties
MybatisAutoConfiguration 类还会用 @Bean 注册 SqlSessionFactory。并调用 MybatisProperties 类里的resolveMapperLocations(),将mapperLocations配置的路径 下的xml文件 解析成resource对象, 放到 SqlSessionFactory 里。
调用SqlSessionFactoryBean 的getObject方法 new出sqlSessionFactory 对象
buildSqlSessionFactory()会 new出XMLMapperBuilder,解析mapper.xml的resource对象集合,加载到Configuration对象里
最后返回出去持有 Configuration对象的DefaultSqlSessionFactory 对象,注册到Spring容器中
2.第二种方式 : 加载与Mapper接口同包同名的xml.
在每个Mapper接口类 的代理对象 依赖注入后,会按照 Mapper接口的全限定性名(没有java后缀) + xml后缀来加载xml文件。
意思就是 加载了 a.b.UserMapper.java 就会去 加载 a.b.UserMapper.xml
MapperFactoryBean 父类 DaoSupport 实现的 afterPropertiesSet()方法中 会调用MapperFactoryBean 重写过后的checkDaoConfig()方法 ,
afterPropertiesSet()会在bean 属性的依赖注入后 被spring调用
添加Mapper接口到Configuration中
加载xml资源
最终是 根据class的name ,+.xml 去加载xml文件资源,如果能获取到流,就说明存在,就去调mybatis里解析xml的解析器去解析xml文件。
3.结论
其实两种方式是可以共存的,并不冲突。
在springboot中,
如果配置了mybatis.mapperLocations,那么会加载该属性配置的包下的xml。 并且还会加载与Mapper接口同包同名的xml.
如果没配置mybatis.mapperLocations,只会加载与Mapper接口同包同名的xml.