@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
>
另一种是统一自动注入:
-
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
-
<property name="basePackage" value="org.mybatis.spring.sample.mapper" /> - </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接口的代理实现类。