mybatis-spring源码解析--mapper注册详解
2023-06-13 09:15:23 时间
上一篇《mybatis3源码解析--spring下mapper注册详解》分析了在spring中使用mybatis时,mapper的注册过程,可能不是很详,本篇将使用spring的方式编程式加载mybatis的mapper文件并进行测试。
在spring中使用mybatis,需要使用mapperScan注解,通常在该注解中指定basePackages和sqlSessionFactory。该注解中引入了MapperScannerRegistrar.class。
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(MapperScannerConfigurer.class)
.addPropertyValue("processPropertyPlaceHolders", false)
.addPropertyValue("basePackage", "com.star.hello.mapper")
.addPropertyValue("defaultScope", "")
.addPropertyValue("sqlSessionFactoryBeanName", "sqlSessionFactory")
.getBeanDefinition();
beanFactory.registerBeanDefinition("MapperScannerRegistrar", beanDefinition);
在MapperScannerRegistrar中做了一件事情就是注册bean定义信息,类型是MapperScannerConfigurer,这里直接使用BeanDefinitionBuilder进行模拟。
当然这里需要给该类设置相应的属性值,数据源和sqlSessionFactory,这里同样使用BeanDefinitionBuilder进行注册。
AbstractBeanDefinition myConfigBeanDefinition = BeanDefinitionBuilder.genericBeanDefinition(MyConfig.class)
.getBeanDefinition();
beanFactory.registerBeanDefinition("MyConfig", myConfigBeanDefinition);
@Configuration
static class MyConfig {
@Bean(name = "dataSource")
public DataSource setDataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.HSQL)
.addScript("init.sql")
.build();
}
@Bean(name = "sqlSessionFactory")
public SqlSessionFactory setSqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}
}
MapperScannerConfigurer实现了BeanDefinitionRegistryPostProcessor,该类又实现了bean工厂后置处理器(BeanFactoryPostProcessor),这里需要调用后置处理器逻辑。
{
// 注册相关的后置处理器
AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory);
// 执行MapperScan后置处理器
beanFactory.getBeansOfType(BeanFactoryPostProcessor.class).values().forEach(beanFactoryPostProcessor -> {
if (beanFactoryPostProcessor instanceof BeanDefinitionRegistryPostProcessor) {
((BeanDefinitionRegistryPostProcessor) beanFactoryPostProcessor).postProcessBeanDefinitionRegistry(beanFactory);
} else {
beanFactoryPostProcessor.postProcessBeanFactory(beanFactory);
}
});
// 执行bean的后置处理器
beanFactory.getBeansOfType(BeanPostProcessor.class).values().forEach(beanFactory::addBeanPostProcessor);
}
根据mybatis-spring的构造,就可以通过bean工厂获取mapper文件进行调用了。
UserMapper userMapper = beanFactory.getBean(UserMapper.class);
System.out.println(userMapper);
userMapper.getAllUserInfo().stream().forEach(e-> System.out.println(e.getNickName()+" "));
---------------------------------------------------------------
org.apache.ibatis.binding.MapperProxy@2e377400
star moon sun
相关文章
- 防止内卷,拒绝潜规则|工兵踩地雷之Spring Cloud Alibaba核心注册原理|35岁程序员那些事
- Spring学习笔记(三)——Spring注解开发&spring与Junit整合测试
- Spring学习笔记(五)——JdbcTemplate和spring中声明式事务
- Spring学习笔记(十八)——spring日志框架的配置和使用
- Spring学习笔记(三十六)——SpringBoot 实现大文件分片上传、断点续传及秒传
- Spring 注册 Bean 在配置中的定义和使用 Autowired
- SSM-Spring整合Mybatis[通俗易懂]
- 理论:第五章:Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点
- 一篇文章带你掌握主流基础框架——Spring
- 微服务组件--注册中心Spring Cloud Eureka分析
- Spring MVC中redirect重定向3种方式(带参数)
- spring注解@Conditional 按照一定的条件进行判断,满足条件给容器中注册bean
- mybatis3源码解析--spring下mapper注册详解
- Spring RestTemplate进阶:拦截器
- Spring:声明式事务
- Spring Cloud Consul服务注册与发现
- 公司用了 6 年的Spring Boot 部署方案!打包 + Shell 脚本详解,稳的一批!
- Spring Cloud Stream核心组件Source
- Spring Cloud Bus使用自定义的消息转换器(三)
- Spring Cloud Task取消任务
- Spring MVC @ModelAttribute注解
- Spring Cloud 入门教程(一): 服务注册详解编程语言
- Spring Cloud分布式微服务系统中利用redssion实现分布式锁详解编程语言
- Spring Boot(十四):spring boot整合shiro-登录认证和权限管理详解编程语言
- Spring MVC的国际化
- Spring MVC使用SimpleMappingExceptionResolver类异常处理
- Spring Boot 2.x :通过 spring-boot-starter-hbase 集成 HBase