SpringBoot集成MyBatis底层原理及简易实现

本文探讨SpringBoot集成MyBatis的底层原理,包括BeanDefinition在Spring中的作用,FactoryBean如何让MyBatis的DAO接口实例化,以及如何通过动态代理实现接口实例化。同时介绍了如何通过自定义BeanFactoryPostProcessor和ImportBeanDefinitionRegistrar实现动态扫描并注册DAO接口。
摘要由CSDN通过智能技术生成

MyBatis是可以说是目前最主流的Spring持久层框架了,本文主要探讨SpringBoot集成MyBatis的底层原理。完整代码可移步Github。

如何使用MyBatis#
一般情况下,我们在SpringBoot项目中应该如何集成MyBatis呢?

引入MyBatis依赖
Copy

org.mybatis.spring.boot
mybatis-spring-boot-starter
2.1.2

配置数据源
在启动类上添加@MapperScan注解,传入需要扫描的dao层的包路径
在dao层中创建接口,在方法上传入对应的SQL语句,也可以使用Mapper.xml文件进行配置。例如:
Copy
public interface UserDao {
@Select(“insert into user xxx”)
void insert();
}
完成这些工作后,我们就可以调用new UserDao().insert()方法来实现对数据库的操作了。
那么问题来了,MyBatis是如何通过如此简单的配置完成完成与Spring的“无缝连接”和数据的持久化工作的呢?

Spring的BeanDefinition#
众所周知,Spring的一大特性是IoC,既控制反转。当我们将一个对象交给Spring管理之后,我们就不需要手动地通过new关键字去创建对象,只需要通过@Autowired或者@Resource自动注入即可。那么这个过程是如何实现的呢?

简单来说,Spring会通过一个被声明为bean的类信息生成一个beanDefinition(后面简称BD)对象,然后通过这个BD对象创建一个单例(不声明为prototype的情况下),存入单例池,需要时进行调用。

在创建beadDefinition时,Spring会调用一系列的后置处理器(postProcessor)对BD加以处理,我们也可以自定义后置处理器,对BD的属性进行修改,只需要实现BeanFactoryPostProcessor接口即可,例如:

Copy
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
GenericBeanDefinition userDaoBD = (GenericBeanDefinition)beanFactory.getBeanDefinition(“userDao”);
userDaoBD.setBeanClassName(“userDaoChanged”);
userDaoBD.setAbstract(false);
// more…
}
}
在这个postProcessor中,我们获取了UserDao的BD对象,并且将它的名字修改为"userDaoChanged",这样我们就可以通过调用ApplicationContext的getBean(“userDaochanged”)方法获取到原来的userDao的bean。

关于MyBatis#
现在我们知道了,当我们将一个类交给Spring管理时,Sprin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值