通过调用SqlSessionFactoryBuilder
的build
方法,最终返回了一个DefaultSqlSessionFactory
实例,这个DefaultSqlSessionFactory
中保存了一个非常重要的Configuration
对象。
二、@MapperScan都做了什么?
在注解配置mybatis时,通过@MapperScan
指定Mapper存放的包,就能自动为我们把接口实现成类。那么这是怎么实现的呢?
点开@MapperScan
的源码,发现上面还有一行非常重要的注解:
@Import(MapperScannerRegistrar.class)
ImportBeanDefinitionRegistrar
接口提供registerBeanDefinitions
方法向用户暴露了BeanDefinitionRegistry
,也就是说可以让用户手动创建BeanDefinition
并使用该注册器注册到spring容器中。
查看MappercannerRegistrar
的方法registerBeanDefinitions
中的核心代码:
ClassPathMapperScanner scanner = new ClassPathMapperScanner(registry);
……
scanner.doScan(StringUtils.toStringArray(basePackages));
主要是创建了一个Mapper扫描器,开启扫描。看看ClassPathMapperScanner
中doScan
方法:
这里对生成的mapper的bean定义做了进一步处理。进入processBeanDefinitions()
方法:
注意画框代码及上方的注释,先看一下从BeanDefinitionHolder
获得BeanDefinition时beanClass
初始的值:
等待setBeanClass
执行完毕:
通过definition.setBeanClass()
把原来的BeanClass的类型替换成了MapperFactoryBean
类型。到这,完成了Mapper接口加载定义阶段中非常重要的一步,而这也是生成代理对象MapperProxy
的关键。
三、mybatis如何生成代理对象?
看一下MapperFactoryBean
的继承关系:
MapperFactoryBean
继承的SqlSessionDaoSupport
类实现了InitializingBean
接口,那么我们还是首先找afterPropertiesSet()
方法:
DaoSupport
中,最终调用MapperFactoryBea
n中的方法:
首先通过获取sqlSession
获得了非常重要的配置类Configuration
,然后查看一下addMapper
方法,最终调用的是MapperRegistry
的addMapper
方法:
红框中的代码为我们创建了Mapper 的代理工厂对象(还不是Mapper的代理对象),并把它放入了knownMappers
这个Map中。
在这一步,只是简单初始化了MapperProxyFactory
,把我们自己的mapper的类型传给了它,还并没有真正产生代理对象。
MapperRegistry
并在之后的parse()
方法中完成了xml文件的解析,每一个sql方法都被解析成了一个MappedStatement
对象,并添加到了配置类Configuration
对象中。
MapperFactoryBean最终返回了什么?
因为MapperFactoryBean
实现了FactoryBean
接口,所以我们看看getObject
方法究竟返回了什么:
最终调用MapperRegistry的getMapper
方法:
这里调用的了mybatis刚才生成的MapperProxyFactory
,帮助我们实例化并返回了一个代理对象。
MapperProxyFactory
中使用newInstance
方法,实例化MapperProxy
,用于生成代理:
至此,我们已经弄明白了文章开头的MapperProxy
是如何生成的。
四、MapperProxy代理对象如何执行sql语句?
在StudentServiceImpl中的query方法中打一个断点跟踪语句,你会发现实际执行的就是代理类MapperProxy
中的invoke()
方法。
MapperProxy
在作为代理类的同时,自身实现了InvocationHandler
接口,所以invoke
方法就是真正执行的代理逻辑。
在这里最终调用了MapperMethod
的execute
方法实际去执行了sql语句。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
总结
总体来说,如果你想转行从事程序员的工作,Java开发一定可以作为你的第一选择。但是不管你选择什么编程语言,提升自己的硬件实力才是拿高薪的唯一手段。
如果你以这份学习路线来学习,你会有一个比较系统化的知识网络,也不至于把知识学习得很零散。我个人是完全不建议刚开始就看《Java编程思想》、《Java核心技术》这些书籍,看完你肯定会放弃学习。建议可以看一些视频来学习,当自己能上手再买这些书看又是非常有收获的事了。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
放弃学习。建议可以看一些视频来学习,当自己能上手再买这些书看又是非常有收获的事了。
[外链图片转存中…(img-eJeG6YvO-1712800589944)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-z6RCi8nd-1712800589944)]