一、使用包扫描的配置方式生成Mapper的动态代理对象
上一篇文章中介绍了SqlSessionFactoryBean 通过Mybatis主配置文件生成Mapper接口的代理对象,并将其保存到
Configuration
中,但是一般在开发中我们并不是采用这种方式配置Mapper接口,因为这种方式是针对单个接口进行配置的,如果有大量的Mapper接口,这样配置就很麻烦。开发中我们通常使用包扫描的方式进行配置。例如下面的配置:
<!-- mybatis操作接口扫描 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="annotationClass" value="javax.annotation.Resource" /><property name="basePackage" value="com.xxx.md.xxx.xxx.dao" /><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /></bean>
其中basePackage就是我们配置的Mapper文件所在的包,我们追踪下代码来看一下,
MapperScannerConfigurer是如何通过包扫描的方式将我们的Mapper保存到Configuration。
1.1 MapperScannerConfigurer 类
该类的主要作用是初始化我们配置的参数,并调用方法扫描配置的包。
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {if (this.processPropertyPlaceHolders) {processPropertyPlaceHolders();}ClassPathMapperScanner scanner = new ClassPathMapperScanner(registry);scanner.setAddToConfig(this.addToConfig);scanner.setAnnotationClass(this.annotationClass);scanner.setMarkerInterface(this.markerInterface);scanner.setSqlSessionFactory(this.sqlSessionFactory);scanner.setSqlSessionTemplate(this.sqlSessionTemplate);scanner.setSqlSessionFactoryBeanName(this.sqlSessionFactoryBeanName);scanner.setSqlSessionTemplateBeanName(this.sqlSessionTemplateBeanName);scanner.setResourceLoader(this.applicationContext);scanner.setBeanNameGenerator(this.nameGenerator);scanner.registerFilters();scanner.scan(StringUtils.tokenizeToStringArray(this.basePackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS));}
从上面代码我们可以看到真正执行扫描的是ClassPathMapperScanner类的Scan方法。
1.2 ClassPathMapperScanner
ClassPathMapperScanner类继承了Spring提供的ClassPathBeanDefinitionScanner类。Scan方法的实现在父类中。
public int scan(String... basePackages) {int beanCountAtScanStart = this.registry.getBeanDefinitionCount();doScan(basePackages);// Register annotation config processors, if necessary.if (this.includeAnnotationConfig) {AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);}return (this.registry.getBeanDefinitionCount() - beanCountAtScanStart);}
在执行scan()方法时,会执行doScan()方法,这个方法在
ClassPathMapperScanner类中有具体实现。

本文深入探讨Mybatis框架中Mapper接口的代理实现机制,通过分析源码揭示MapperScannerConfigurer如何配置并扫描Mapper接口。了解这一过程对于优化Mybatis使用和自定义开发具有重要意义。
1968

被折叠的 条评论
为什么被折叠?



