MyBatis底层原理

动态代理

mybatis其底层代码实现mapper类是用动态代理实现我们xml或者是mapper接口。

在实现InvocationHandler过程中,其SqlSession.getMapper()利用动态代理技术。其中框架中的InvocationHandler实现类重写了底层的invoke()方法。在invoke方法中,其实现了jdbc连接,然后再在注解,或者是查阅配置文件中的sql语句。接着sql语法的解析与拼接。然后调用查询查出结果返回给代理对象。代理对象就可以接收得到结果了。

与Spring整合的容器管理

想要SqlSessionFactory对象被Spring管理,则需要向Spring中注册Bean。因此需要在配置类中写上Dao层接口所在包名的Scan注解。然后在配置类中返回其SqlSessionFactory,并注解上@Bean。

与SpringBoot整合

但是在SpringBoot中,SpringBoot只有一个配置文件,又是如何知道它是Bean呢?

由于SpringBoot配置文件中有各种配置,因此我们可以扫描那些配置,然后得到配置信息。调用MyBatis的初始化模块进行一些信息配置的初始化。在单独MyBatis中,它是XML解析的。但是在与SpringBoot整合过程中,它不是XML解析。得到配置然后初始化MyBatisContext之后,SpringBoot就开始创建SqlSessionFactory。并将它保存在Context中。

MyBatis如何做到产生的代理对象放入Spring容器中

首先我们要实现FactoryBean接口。重写方法。其中有两个方法,一个是getObject()方法,一个是getObjectType()方法。之后还需要在类中定义一个Class用于接收与其对应的Mapper类(注意要写构造函数将这个成员变量赋值)。之后再写一个ImportBeanDefinitionRegistrar类,然后for循环扫描包下的类,用BeanDefinition来给这些类注入构造函数的参数。并利用构造函数生成类,并注册进SpringIOC容器中。

因此,到此,我们就可以利用Spring的MapperScan扫描我们包下的类,然后实现将创建好的代理对象自动注入到Service层中了。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值