spring源码之Mybatis扫描器

点进MapperScan这个注解,可以看到注入了这个类MapperScannerRegistrar
在这里插入图片描述
点进这个类,可以看到继承了ImportBeanDefinitionRegistrar接口,实现了regidterBeanDefinition()方法,也就是说在spring容器扫描完,处理BeanDefinitionMap的时候,调用了这个扩展接口。
在这里插入图片描述
而这个方法主要做的就是向beanDefinitionMap中添加了一个类,叫MapperScannerConfigurer
在这里插入图片描述
点进这个类MapperScannerConfigurer,可以看到它继承了BeanDefinitionRegistryPostProcessor,
在这里插入图片描述
那就以为意味着,一定会执行这个方法postProcessBeanDefinitionRegistry()
这个方法的主要作用是构造了一个mybatis的扫描器
其中需要注意的点就是这个方法
在这里插入图片描述
这个方法是在扫描器中添加了几个过滤器,
第一个annotationClass:是指在扫描的注解中如果有annotationClass属性的话,那么扫描到的类,就必须要添加属性中指定的注解,才会被处理。 如:@MapperScan(value = “com.spring.batis.dao”, annotationClass = Mapper.class) ,只有扫描到的类,都加了Mapper注解的话,才会被mybatis代理

第二个markerInterface:这个里面直接返回了false,包下面所有的接口都不扫描了

第三个是acceptAllInterfaces:这个里面直接返回了true,意思是所有扫描到的接口全都处理。这可以解释一下这个lambda表达式。它传入的是 TypeFilter类,所以这行代码等同于

addIncludeFilter((metadataReader, metadataReaderFactory) -> true);

//等同于

addIncludeFilter(new TypeFilter() {
			@Override
			public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
				return true;
			}
		});

第四个一般都是没有这个类,可以忽略。
在这里插入图片描述

再回到postProcessBeanDefinitionRegistry()方法中,看他的scan()方法
在这里插入图片描述
scan()方法是在父类ClassPathBeanDefinitionScanner中执行,而其中的doScan()方法又到了子类过滤器ClassPathMapperScanner中执行。
在这里插入图片描述
虽然最终执行的还是父类doScan()方法,但是这个下面的代码是很重要的。
在这里插入图片描述
那这个doScan()方法又回到了spring的源码中了,我们已经分析过如何扫描个过滤的。
在这里插入图片描述

spring boot如何扩展mybatis

按照上面的源码分析,也就是说,如果MapperScan注解中不加annotation这个属性去指定Mapper注解的话,就可以扫描指定包下面的所有接口。
那么为什么springBoot不需要写MapperScan注解,但是需要将mybatis接口类上写@Mapper注解呢,如果不写的话这个mapper接口就不会生效。

大概说一下,就是springboot不需要手动添加MapperScan,它会自动通过mybatis-spring-boot-starter中的配置类,进行扫描,而扫描的时候,添加了一个Mapper注解的过滤器。也就是说,扫描到的接口类,只有添加了@Mapper注解的才会作为mapper来处理。
所以我们在使用springBoot进行开发的时候,尽量把mapper接口文件放在同一个中,并且统一添加mapper注解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是Spring整合MyBatis的代码示例: 1. 首先,在pom.xml文件中添加MyBatisSpring的依赖: ```xml <dependencies> <!-- MyBatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <!-- MyBatis-Spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version> </dependency> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.9</version> </dependency> </dependencies> ``` 2. 在Spring的配置文件中配置数据源和MyBatis的SqlSessionFactory: ```xml <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test"/> <property name="username" value="root"/> <property name="password" value="123456"/> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mapperLocations" value="classpath*:mapper/*.xml"/> </bean> ``` 其中,`mapperLocations`指定了MyBatisMapper文件所在的位置。 3. 配置MyBatisMapper扫描器: ```xml <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.example.mapper"/> </bean> ``` 其中,`basePackage`指定了Mapper接口所在的包名。 4. 在代码中使用MyBatis: ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public User getUserById(int id) { return userMapper.getUserById(id); } } @Repository public interface UserMapper { User getUserById(int id); } ``` 在这个例子中,`UserMapper`是一个MyBatisMapper接口,`UserServiceImpl`是一个Spring的Service实现类,通过@Autowired注入了`UserMapper`,在`getUserById`方法中调用了`UserMapper`的方法。 以上就是Spring整合MyBatis的代码示例,希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木小同

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值