1.第一種方式: 加載mapperLocations指定路徑下的xml
如果配置了mybatis.mapperLocations,那么會(huì)加載該屬性配置的包下的xml。
mybatis.mapper-locations=classpath:mapper/*.xml
那么 這個(gè)配置就會(huì)被裝載到 MybatisProperties這個(gè)類里

然后mybatis -springboot啟動(dòng)器 會(huì)通過spi 注冊(cè)這個(gè)類MybatisAutoConfiguration,這個(gè)類里 有@EnableConfigurationProperties(MybatisProperties.class)注解,注冊(cè)MybatisProperties類 去加載對(duì)應(yīng)的配置信息,然后通過構(gòu)造方法 的 參數(shù)注入,注入MybatisProperties對(duì)象,賦值給成員變量properties

MybatisAutoConfiguration 類還會(huì)用 @Bean 注冊(cè) SqlSessionFactory。并調(diào)用 MybatisProperties 類里的resolveMapperLocations(),將mapperLocations配置的路徑 下的xml文件 解析成resource對(duì)象, 放到 SqlSessionFactory 里。

調(diào)用SqlSessionFactoryBean 的getObject方法 new出sqlSessionFactory 對(duì)象


buildSqlSessionFactory()會(huì) new出XMLMapperBuilder,解析mapper.xml的resource對(duì)象集合,加載到Configuration對(duì)象里

最后返回出去持有 Configuration對(duì)象的DefaultSqlSessionFactory 對(duì)象,注冊(cè)到Spring容器中

2.第二種方式 : 加載與Mapper接口同包同名的xml.
在每個(gè)Mapper接口類 的代理對(duì)象 依賴注入后,會(huì)按照 Mapper接口的全限定性名(沒有java后綴) + xml后綴來加載xml文件。
意思就是 加載了 a.b.UserMapper.java 就會(huì)去 加載 a.b.UserMapper.xml
MapperFactoryBean 父類 DaoSupport 實(shí)現(xiàn)的 afterPropertiesSet()方法中 會(huì)調(diào)用MapperFactoryBean 重寫過后的checkDaoConfig()方法 ,
afterPropertiesSet()會(huì)在bean 屬性的依賴注入后 被spring調(diào)用

添加Mapper接口到Configuration中



加載xml資源

最終是 根據(jù)class的name ,+.xml 去加載xml文件資源,如果能獲取到流,就說明存在,就去調(diào)mybatis里解析xml的解析器去解析xml文件。

3.結(jié)論
其實(shí)兩種方式是可以共存的,并不沖突。
在springboot中,
如果配置了mybatis.mapperLocations,那么會(huì)加載該屬性配置的包下的xml。 并且還會(huì)加載與Mapper接口同包同名的xml.
如果沒配置mybatis.mapperLocations,只會(huì)加載與Mapper接口同包同名的xml.