跟着源码学mybatis(二):@Mapper注解的扫描方式

     @Mapper注解有什么作用呢?Ctrl键进入Mapper注解类,会发现毛都没有,连个默认值都没有。那么,mybatis是怎么让它发挥作用的?

   为了更好地支持与spring集成,mybatis提供了mybatis-spring包。在mybatis-spring包下,mapper包是让mapper接口类发挥作用的关键包。我们已知的是,在spring集成mybatis时除了配置SqlSessionFactoryBean外,还需要配置mapper接口的Bean。有两种方式达到这个目的,一种是手动注入:

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
  <property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper">
  <property name="sqlSessionFactory" ref="sqlSessionFactory">
</property></property>
</bean>

 另一种是统一自动注入:

  1. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">



  2. <property name="basePackage" value="org.mybatis.spring.sample.mapper" />
  3. </bean>

    需要关注的是手动注入的情况,我们可以看到bean的类申明为org.mybatis.spring.mapper.MapperFactoryBean。

MapperFactoryBean又是个什么呢?光从名字来解读,它是生产mapper的工厂bean。没错,事实上就是如此。在

https://blog.csdn.net/qq_28802119/article/details/80914928这篇文章中我有提到过,我们通过spring的自动注入方式getBean时,

其实是调用MapperFactoryBean的getObject方法来得到mapper接口的实例对象的。也就是说,MapperFactoryBean就是我们得到mapper接口

代理类的那个工厂。既然可以得到,那么一定有注入喽?

   没错,无论是第一种方式,还是第二种方式,最终都是通过ClassPathMapperScanner类的doScan方法将我们需要注入的

mapper接口放入MapperFactoryBean中的,@Mapper注解就是在这时发挥作用的。这样,我们在实际开发中通过MapperFactoryBean来得到

mapper接口代理实现类。

   追踪源码,发现有两个地方调用了ClassPathMapperScanner类的doScan方法,分别是MapperScannerConfigurer类和
MapperScannerRegistrar类。前者用来处理xml配置文件中的mapper注入,后者是@MapperScanner注解的处理类,会将

@MapperScanner注解中的包路径下的mapper接口扫描并注册为MapperFactoryBean。也就是说,mybatis提供了xml配置和注解声

明两种方式来生成mapper接口的代理实现类。



猜你喜欢

转载自blog.csdn.net/qq_28802119/article/details/80935564
今日推荐