【mybatis】springboot加载mapper.xml文件的方式

1.第一种方式: 加载mapperLocations指定路径下的xml

如果配置了mybatis.mapperLocations,那么会加载该属性配置的包下的xml。

mybatis.mapper-locations=classpath:mapper/*.xml

那么 这个配置就会被装载到 MybatisProperties这个类里

image

然后mybatis -springboot启动器 会通过spi 注册这个类MybatisAutoConfiguration,这个类里 有@EnableConfigurationProperties(MybatisProperties.class)注解,注册MybatisProperties类 去加载对应的配置信息,然后通过构造方法 的 参数注入,注入MybatisProperties对象,赋值给成员变量properties

image

MybatisAutoConfiguration 类还会用 @Bean 注册 SqlSessionFactory。并调用 MybatisProperties 类里的resolveMapperLocations(),将mapperLocations配置的路径 下的xml文件 解析成resource对象, 放到 SqlSessionFactory 里。

image

调用SqlSessionFactoryBean 的getObject方法 new出sqlSessionFactory 对象

image
image

buildSqlSessionFactory()会 new出XMLMapperBuilder,解析mapper.xml的resource对象集合,加载到Configuration对象里

image

最后返回出去持有 Configuration对象的DefaultSqlSessionFactory 对象,注册到Spring容器中

image

2.第二种方式 : 加载与Mapper接口同包同名的xml.

在每个Mapper接口类 的代理对象 依赖注入后,会按照 Mapper接口的全限定性名(没有java后缀) + xml后缀来加载xml文件。

意思就是 加载了 a.b.UserMapper.java 就会去 加载 a.b.UserMapper.xml

MapperFactoryBean 父类 DaoSupport 实现的 afterPropertiesSet()方法中 会调用MapperFactoryBean 重写过后的checkDaoConfig()方法 ,

afterPropertiesSet()会在bean 属性的依赖注入后 被spring调用

image
        添加Mapper接口到Configuration中
image
image
image

加载xml资源

image

最终是 根据class的name ,+.xml 去加载xml文件资源,如果能获取到流,就说明存在,就去调mybatis里解析xml的解析器去解析xml文件。

image

3.结论

其实两种方式是可以共存的,并不冲突。

在springboot中,

  • 如果配置了mybatis.mapperLocations,那么会加载该属性配置的包下的xml。 并且还会加载与Mapper接口同包同名的xml.

  • 如果没配置mybatis.mapperLocations,只会加载与Mapper接口同包同名的xml.

你可能感兴趣的:(【mybatis】springboot加载mapper.xml文件的方式)