应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

Spring整合MyBatis之底层原理

  作者波哥
  审校孙淑娟
  如果老铁们对Spring框架足够熟悉,整合MyBatis其实很容易理解,当然这里假定老铁们也已经熟悉了MyBatis框架。
  在我们正常的应用开发过程中,使用MyBatis一般分为如下几个步骤:
  1。在配置类上增加MapperScan注解,例如:MapperScan(basePackages{com。test。dao},annotationClassMapper。class);
  2。在basePackages指定的目录下创建待MyBatis读取的接口文件,例如:MapperpublicinterfaceTestMapper{。。。。。。}1。2。3。4。
  3。在Service或者其他地方使用该Mapper来操作数据库。
  使用起来是很简单的,但是有没有老铁想过,为什么做了这么一个简单的配置,这个Mapper就能操作数据库了?按理说这个Mapper是个接口,应该是不能被创建才对啊!如果你有这个疑问,证明你是个爱思考的好童鞋。
  咱们直接进入主题。Spring要与MyBatis整合,简单来说只要解决如下两个问题:一、Spring如何知道哪些类应该被管理?
  要让Spring去管理Bean的生命周期,首先需要对应的类被Spring扫描到,并且生成DeanDefinition,然后基于BeanDefinition生成Bean。下面对Spring生成BeanDefinition的方式做个小总结:包含Component、Configuration、ComponentScan、Import、ImportResource注解的类;Import注解中指定的类、被Bean注解标注的方法所在的类;实现了ImportBeanDefinitionRegistrar接口,并且在registerBeanDefinitions方法中调用registry直接注册的类;实现了ImportSelector接口,并且在selectImports方法中返回的字符串对应的类;直接调用register方法;另外Spring还提供了一个扩展,可以让开发者自己指定需要被管理的类对应的类型:通过往includeFilters中添加注解类类型。
  我们分析源码,第一步得找到它的入口,Spring整合MyBatis的入口,毫无疑问是MapperScan这个注解,在MapperScan注解上包含Import(MapperScannerRegistrar。class)注解,Spring整合MyBatis正是用了Import和ImportBeanDefinitionRegistrar的方式。我们先通过一张流程图来了解下整体流程,然后再慢慢品。
  我们来看MapperScannerRegistrar这个类的继承关系图:
  MapperScannerRegistrar是ImportBeanDefinitionRegistrar的实现类,Spring会去调用这个类的registerBeanDefinitions方法添加beanDefinition,这个方法中具体做了些什么呢:
  获取MapperScan注解的配置信息,比如basePackages、annotationClass,basePackages表示需要扫描的路径,annotationClass则是指定了增加了这种注解类的类需要被Spring进行管理,比如增加了Mapper注解的类需要被Spring管理。
  生成MapperScannerConfigurer这个类型的beanDefinition,并且把MapperScan注解的配置信息添加到该beanDefinition的属性集合中。
  后续Spring就会基于这个MapperScannerConfigurer做一系列文章,看下它的继承关系:
  它是BeanDefinitionRegistryPostProcessor的实现类,是一个BeanFactory后置处理器,Spring会调用该类的postProcessBeanDefinitionRegistry方法来添加beanDefinition的操作,MapperScannerConfigurer这个类中具体实现如下:
  它定义了ClassPathMapperScanner这个扫描器,然后使用这个扫描器来扫描类,扫描哪些类呢?扫描有Mapper注解的类,看它的关系知道,它是ClassPathBeanDefinitionScanner的子类,而spring则是使用ClassPathBeanDefinitionScanner来进行扫描的。
  为什么ClassPathMapperScanner能够扫描到带有Mapper注解的类呢?看上面代码,就是通过调用registerFilters方法来添加includeFilter(实际类型是:TypeFilter),这个就是Spring提供的扩展点,让咱们自己来指定需要被扫描的类,这里使用的是MappScan注解中annotationClass属性配置的注解类型,我们这里配置了Mapper,所以调用scan方法开启扫描后,Spring就会将包含Mapper注解的类扫描为BeanDefinition。注意这里的扫描能力还是调用Spring的扫描器来实现的,ClassPathMapperScanner并没有修改,只是当扫描完成后,ClassPathMapperScanner会对扫描出的BeanDefinition进行重新处理,主要是把原来的BeanClass修改成了MapperFactoryBean。class:
  而这个MapperFactoryBean是FactoryBean的实现类,老铁们,FactoryBean这种Bean有什么特点?这个可是面试的高发点哦。
  做个小小的总结:Spring扫描到有Mapper注解的类,生成BeanDefinition,并且将这一类BeanDefinition的BeanClass的值修改为MapperFactoryBean,也就是说它的类型不再是咱们自己编写的Mapper接口了,而是一个FactoryBean,这样Spring就能做妖了。二、Mapper注解的类是接口
  那如何实例化呢?
  到这一步,其实老铁们也大概清楚了,Spring在实例化Mapper实例时,实际上首先会实例化MapperFactoryBean,然后再调用它的getObject方法。我们知道在Java里面接口是肯定不能被实例化的,那这个被实例化的对象只能是一个代理对象,所以我们有理由猜想这个getObject方法应该是用来创建代理对象的。要创建代理对象,得从以下两个方面着手:1。准备工作
  这里Spring准备的是接口类型和创建代理对象的代理工厂。具体如何准备的呢?来看上述MapperFactoryBean类型的整体继承关系:
  它实现了InitializingBean,于是可以知道,在MapperFactoryBean初始化完成后,Spring会调用它的afterPropertiesSet方法,从而会执行到checkDaoConfig方法:
  在该方法中调用configuration的addMapper方法,这个方法里面到底做了啥?
  看出门道了吗?其实就是使用Mapper的接口类型作为key,MapperProxyFactory做为value,然后添加到mapperRegistry对象的Map集合中,注意这个type同时也是MapperProxyFactory对象的构造参数哦。2。实例化
  上述动作已经准备好了,接下来就应该是创建了。Spring在创建完成MapperFactoryBean对象后,最终会调用它的getObject方法来获得真实的对象:
  getObject方法中,会调用getMapper方法,该方法中从knowMappers这个Map集合中拿到MapperProxyFactory对象,这个对象不就是我们在准备阶段添加的嘛!它就是用来创建代理对象的工厂。
  从上面代码中也不难看出,确实是为咱们自己的接口创建了代理对象,而代理类的处理类则是MapperProxy对象,也就是说对所有接口对象的调用,都会进入MapperProxy的Invoke方法,至此Spring成功对接MyBatis。作者介绍
  波哥,互联行业从业10余年,先后担任项目总监及架构师。目前专攻技术,喜欢研究技术原理。技术全面,主攻java,精通JVM底层机制及Spring全家桶底层框架原理,熟练掌握当前主流的中间件、服务网格等技术原理。

怎么才能购买到印度产必利劲?印度必利劲自从在当地上市以来就一直备受关注,而且口碑一直很不错,得到广泛男性同胞们称赞认可,近年来印度必利劲在国内市场上销售份额可谓非常热销一直居高不下,由于德国必利劲价格比较……年化200倍!锚定HT的HT现金HTC。Cash稳定币无损挖年化200倍!锚定HT的HT现金HTC。Cash稳定币无损挖矿到底怎么玩?以太坊暴涨,DeFi热潮持续不减,算法稳定币在2021开年就迎来一波高潮,火币生态链上的项目还有……千万富翁幸卫林的缅甸生死劫之三幸卫林是贵州视通国际旅行社有限公司创始人,2022年8月初,他在出差去昆明的高铁上结识了一位名叫扬飞的邻座同行。在杨飞的游说下他便前往泰国考察旅游项目。就此,他差点踏上了一条不……锚定HT的算法稳定币HT现金锚定HT的算法稳定币mdash;mdash;HT现金将数字资产与特定商品或服务的价格挂钩时,非超额抵押的算法稳定币是一直是所有团队追求的圣杯。从根本上讲,这些资产的稳定性……国网阳信县供电公司梨花盛会花栖木电力赋能万物苏大众网海报新闻记者刘殿章通讯员马闯滨州报道四月春光好,又见梨花开。4月2日,乡村好时节LET’S购主题年第三十四届梨花会暨第十三届黄河三角洲民俗文化节在山东省阳信县盛大召……2021年必利劲在国内价格是多少?必利劲(达泊西汀)是一种用于治疗男性早谢症状的葯物,目前用于一线治疗早谢症状的葯物就是必利劲,疗效非常明显,能够在夫妻运动当中有助于男性延时更久的时间,提高夫妻之间性生活满意度……詹姆斯看到浓眉受伤时我也很难受,我们想要同场打球今日,湖人134109客场大胜火箭,迎来三连胜。赛后,湖人前锋勒布朗詹姆斯接受了采访。当被问到近些年自己屡遭伤病是否让他更加理解安东尼戴维斯的遭遇,詹姆斯说:问题是我不需……什么是现代舞(现代舞的体系)现代舞是什么?你看不懂的就是现代舞!这段经典的对话,在舞蹈圈存在许久。一提起现代舞,许多观众也都觉得十分无聊。然而,在落幕后,很多的现代舞作品确能够产生话题效应。让……怎么样拍卖(拍卖是怎么拍的)竞拍流程第一步阅读公告请在竞价前,仔细阅读《竞买公告》、《竞买须知》等文件,了解拍品的详情。请确认您已知悉拍品的处置程序、起拍时间、拍品描述、瑕疵情况、交纳保……黄山市安心托幼再升级农忙早托更暖心来源:人民网安徽频道黄山市是安徽茶叶重要的主产区,也是广大农民重要的收入来源,每年3月起,春茶进入黄金采摘期,农村地区又到农忙季,聚焦茶农早间送娃难、带娃难的新需求,在幼……巡山令酸汤牛肉火锅加盟费多少钱总部现在火锅是很多人生活中不可缺少的美食,在其中巡山令酸汤牛肉火锅这是一个很有发展潜力的品牌,巡山令酸汤牛肉火锅不管是技术还是产品的品质都已经很成熟,产品种类多样化让人百吃不厌,巡……国产EDA大突破!华为14nm以上全国产,三家厂商搞定了5n众所周知,在芯片产业中,EDA工具被誉为芯片之母,是芯片设计必不可少的具之,也是最上游,最有科技含量的产品之一。目前设计一颗芯片,需要在几十平台毫米的面积中,要塞进去上百……
再迎利好!大运河通航赋能沧州文旅产业高质量发展河北新闻网讯(燕赵都市报纵览新闻记者李家伟、韩泽祥)京杭大运河沧州中心城区段旅游通航,对推动沧州文旅资源开发和文旅产业发展带来一系列积极影响。沧州市文化广电和旅游局有关领导表示……足球报评斯坦利执教国安首秀大开大合,应该是个有意思的人直播吧9月7日讯在斯坦利完成自己国安一线队执教首秀后,《足球报》发文点评表示,从执教首场比赛来看,斯坦利应该是个有意思的人。9月6日晚进行的中超第16轮比赛,国安主场对阵……智能手机的冰火两重天国产厂商进入最艰难周期,苹果高端市场份额过去的一周里,全球智能手机市场发生了两个节点性事件。其一,时隔两年,华为高端手机Mate系列回归,但受到5G领域的技术封锁,Mate50系列依旧只能支持4G网络。其二,苹……OLED笔电能买吗?说不推荐的都是老观念,五大理由告诉你值得自从OLED屏幕笔记本上市以来,网络上对于能不能买的这个问题的争论就始终没有停止,虽然很多人不赞同入手,但从当下的各大笔记本厂商的态度来看,OLED屏幕已经成为当下高素质笔电必……S28辅助梯度,张飞东皇yyds,苏烈值得信赖S28赛季,谁才是游走位的真辅王呢?大家好,我是策策。T3梯度:五位辅助孙膑瑶项羽夏侯惇白起首先,T3位置还共有五位辅助。在这个节奏为王的版本里,……2022年加密行业最奇怪的5件事?弗朗西斯科罗德里格斯加密技术可能变得怪异:2022年业界最奇怪的5件事。从Terra到FTX,2022年给了我们许多奇怪的加密故事。尽管投资者一直在承受着加密行业市……面部做了脂肪修复后,一下子年轻了好几岁经常有不少求美者都问到,脂肪修复手术究竟难在哪里?这个问题要分开来说,不同部位进行脂肪修复时有不同的难度。面部分布着大量的血管、神经、肌肉、组织等,这些都是维系面部……清洁能源运营龙头,协鑫能科换电模式加速推进,蓝海赛道空间大(报告出品方分析师:浙商证券张雷屈文敏)1协鑫能科:国内领先的清洁能源综合服务商协鑫能科是国内领先的清洁能源综合服务商。协鑫能科主要从事清洁能源运营、移动能源运营和……埃森哲首布AI成熟度评估半数受访企业仍有待发掘价值近日,埃森哲在发布的人工智能成熟度评估中指出,大部分中国企业仍处于应用人工智能的试验阶段,企业需要加大AI规模化应用力度,从而推动企业持续转型和全面重塑。这是埃森哲首次发布人工……欧米茄为海马AquaTerra的系列增添两种新色调我们过去已经说过,但如果您正在寻找一款出色的日常奢华腕表,兼具周末的耐力和工作日的休闲优雅,欧米茄无疑是市场上最好的选择之一:海马AquaTerra150米至臻天文台表。时尚、……国内9月份适合出游的三个地方,你去过几个?9月已入秋,往日的燥热正在消失殆尽,天不冷不热,正是适合出游的季节,适合出游的地方很多,但,小编今天给大家推荐几个地方,与其他地方不一样,美得别致,美得不真实,你去过几个呢?……22岁哈兰德职业生涯14次戴帽,英超2次德甲3次欧冠1次直播吧9月3日讯英超第4、第5轮,哈兰德连场戴帽,进球网盘点了哈兰德职业生涯至今完成的14次帽子戏法。俱乐部:挪超(莫尔德),1次,2019年奥地利杯(萨尔茨……
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网