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

分享一个修改了xml文件再也不用重启的项目mybatisxm

  自我18年使用Mybaits以来,开发环境中如果修改了xml文件后,只有重启项目才能生效,如果小项目重启还好,但是对于一个重启需要十几分钟的大型项目来说,这就非常耗时了。开发人员因为修改了xml文件少量内容,比如添加一个逗号、查询增加一个字段或者修改一个bug等,就需要重启整个项目,这就非常痛苦了。
  所以在这里给大家推荐一个实现了Mybatisxml文件热加载的项目,mybatisxmlreloadspringbootstarter。它能够帮助我们在SpringBootMybatis的开发环境中修改xml后,不需要重启项目就能让修改过后xml文件立即生效,实现热加载功能。这里给出项目地址:https:github。comwayn111mybatisxmlreloadspringbootstarter欢迎大家关注,点个star
  ps:mybatisxmlreloadspringbootstarter目前3。0。3。m1版本实现了xml文件修改已有内容,比如修改sql语句、添加查询字段、添加查询条件等,可以实现热加载功能。但是对于xml文件添加insertupdatedeleteselect标签等内容后,是无法实现热加载的。众所周知,在Idea环境进行Java开发,在方法内修改方法内容是可以热加载的。但是添加新方法、添加方法参数,修改方法参数,修改方法返回值等都是无法直接热加载的。一、mybatisxmlreloadspringbootstarter使用
  mybatisxmlreloadspringbootstarter原理:修改xml文件的加载逻辑。在普通的mybatisspring项目中,默认只会加载项目编译过后的xml文件,也就是target目录下的xml文件。但是在mybatisxmlreloadspringbootstarter中,修改了这一点,它会加载项目resources目录下的xml文件,这样用户对于resources目录下xml文件的修改操作是可以立即触发热加载的。通过io。methvin。directorywatcher项目来监听xml文件的修改操作,它底层是通过java。nio的WatchService来实现,当我们监听了整个resources目录后,xml文件的修改会立马触发MODIFY事件。通过mybatisspring项目原生的xmlMapperBuilder。parse()方法重新加载解析修改过后的xml文件来保证项目对于Mybatis的兼容性处理。二、技术原理
  mybatisxmlreloadspringbootstarter代码结构如下:
  核心代码在MybatisXmlReload类中,执行逻辑:通过项目初始化时传入MybatisXmlReloadPropertiesprop,ListsqlSessionFactories参数,获取mybatisxmlreloadspringbootstarter的配置信息,以及项目中的数据源配置是否启动以及xml路径的配置类privateMybatisXmlReloadPropertiesprop;获取项目中初始化完成的SqlSessionFactory列表,对多数据源进行处理privateListSqlSessionFactorysqlSessionFactories;publicMybatisXmlReload(MybatisXmlReloadPropertiesprop,ListSqlSessionFactorysqlSessionFactories){this。propprop;this。sqlSessionFactoriessqlSessionFactories;}解析配置文件指定的xml路径,获取xml文件在target目录下的位置解析项目所有xml路径,获取xml文件在target目录中的位置ListResourcemapperLocationsTmpStream。of(Optional。of(prop。getMapperLocations())。orElse(newString〔0〕))。flatMap(locationStream。of(getResources(patternResolver,location)))。toList();根据xml文件在target目录下的位置,进行路径替换找到xml文件所在resources目录下的位置根据xml文件在target目录下的位置,进行路径替换找到该xml文件在resources目录下的位置for(ResourcemapperLocation:mapperLocationsTmp){mapperLocations。add(mapperLocation);StringabsolutePathmapperLocation。getFile()。getAbsolutePath();FiletmpFilenewFile(absolutePath。replace(CLASSPATHTARGET,MAVENRESOURCES));if(tmpFile。exists()){locationPatternSet。add(Path。of(tmpFile。getParent()));FileSystemResourcefileSystemResourcenewFileSystemResource(tmpFile);mapperLocations。add(fileSystemResource);}}对resources目录的xml文件的修改操作进行监听对resources目录的xml文件修改进行监听ListPathrootPathsnewArrayList();rootPaths。addAll(locationPatternSet);DirectoryWatcherwatcherDirectoryWatcher。builder()。paths(rootPaths)orusepaths(directoriesToWatch)。listener(event{switch(event。eventType()){caseCREATE:filecreatedbreak;caseMODIFY:filemodifiedPathmodifyPathevent。path();StringabsolutePathmodifyPath。toFile()。getAbsolutePath();logger。info(mybatisxmlfilehaschanged:modifyPath);执行热加载逻辑。。。break;caseDELETE:filedeletedbreak;}})。build();ThreadFactorythreadFactoryr{ThreadthreadnewThread(r);thread。setName(xmlreload);thread。setDaemon(true);returnthread;};watcher。watchAsync(newScheduledThreadPoolExecutor(1,threadFactory));对多个数据源进行遍历,判断修改过的xml文件属于那个数据源对多个数据源进行遍历,判断修改过的xml文件属于那个数据源for(SqlSessionFactorysqlSessionFactory:sqlSessionFactories){。。。}根据Configuration对象获取对应的标签属性根据Configuration对象获取对应的标签属性ConfigurationtargetConfigurationsqlSessionFactory。getConfiguration();Classlt;?tClasstargetConfiguration。getClass(),aClasstargetConfiguration。getClass();if(targetConfiguration。getClass()。getSimpleName()。equals(MybatisConfiguration)){aClassConfiguration。class;}SetStringloadedResources(SetString)getFieldValue(targetConfiguration,aClass,loadedResources);loadedResources。clear();MapString,ResultMapresultMaps(MapString,ResultMap)getFieldValue(targetConfiguration,tClass,resultMaps);MapString,XNodesqlFragmentsMaps(MapString,XNode)getFieldValue(targetConfiguration,tClass,sqlFragments);MapString,MappedStatementmappedStatementMaps(MapString,MappedStatement)getFieldValue(targetConfiguration,tClass,mappedStatements);遍历resources目录下xml文件列表遍历resources目录下xml文件列表for(ResourcemapperLocation:mapperLocations){。。。}判断是否是被修改过的xml文件,否则跳过判断是否是被修改过的xml文件,否则跳过if(!absolutePath。equals(mapperLocation。getFile()。getAbsolutePath())){continue;}解析xml文件,获取修改后的xml文件标签对应的resultMapssqlFragmentsMapsmappedStatementMaps的属性并执行替换逻辑,并且兼容mybatisplus的替换逻辑重新解析xml文件,替换Configuration对象的相对应属性XPathParserparsernewXPathParser(mapperLocation。getInputStream(),true,targetConfiguration。getVariables(),newXMLMapperEntityResolver());XNodemapperXnodeparser。evalNode(mapper);StringnamespacemapperXnode。getStringAttribute(namespace);ListXNoderesultMapNodesmapperXnode。evalNodes(mapperresultMap);for(XNodexNode:resultMapNodes){StringidxNode。getStringAttribute(id,xNode。getValueBasedIdentifier());resultMaps。remove(namespace。id);}ListXNodesqlNodesmapperXnode。evalNodes(mappersql);for(XNodesqlNode:sqlNodes){StringidsqlNode。getStringAttribute(id,sqlNode。getValueBasedIdentifier());sqlFragmentsMaps。remove(namespace。id);}ListXNodemsNodesmapperXnode。evalNodes(selectinsertupdatedelete);for(XNodemsNode:msNodes){StringidmsNode。getStringAttribute(id,msNode。getValueBasedIdentifier());mappedStatementMaps。remove(namespace。id);}重新加载和解析被修改的xml文件9。重新加载和解析被修改的xml文件try{XMLMapperBuilderxmlMapperBuildernewXMLMapperBuilder(mapperLocation。getInputStream(),targetConfiguration,mapperLocation。toString(),targetConfiguration。getSqlFragments());xmlMapperBuilder。parse();}catch(Exceptione){logger。error(e。getMessage(),e);}三、安装方式在SpringBoot3。0中,mybatisxmlreloadspringbootstarter在Maven项目提供坐标地址如下:dependencygroupIdcom。wayngroupIdmybatisxmlreloadspringbootstarterartifactIdversion3。0。3。m1versiondependency在SpringBoot2。0Maven项目提供坐标地址如下:dependencygroupIdcom。wayngroupIdmybatisxmlreloadspringbootstarterartifactIdversion2。0。1。m1versiondependency四、使用配置
  mybatisxmlreloadspringbootstarter目前只有两个配置属性。mybatisxmlreload。enabled默认是false,也就是不启用xml文件的热加载功能,想要开启的话通过在项目配置文件中设置mybatisxmlreload。enabled为true。还有一个配置属性是mybatisxmlreload。mapperlocations,执行热加载的xml文件路径,这个属性需要手动填写,跟项目中的mybatis。mapperlocations保持一直即可。具体配置如下:mybatisxml文件热加载配置mybatisxmlreload:是否开启xml热更新,true开启,false不开启,默认为falseenabled:truexml文件路径,可以填写多个,逗号分隔。eg:classpath:mapperMapper。xml,classpath:otherMapper。xmlmapperlocations:classpath:mapperMapper。xml五、最后
  欢迎大家使用mybatisxmlreloadspringbootstarter,这个项目我开源的的,使用中遇到问题可以提交issue。提交的问题我都会一一查看并回复。再附项目地址:https:github。comwayn111mybatisxmlreloadspringbootstarter
  最后再说一句,感兴趣的朋友可以点赞加关注,你的支持将是我更新动力。

RealmeWatch2Pro获得EEC认证即将上市前段时间,我们通过RealmeLink应用中的一些代码发现,Realme正在研发两款新的智能手表,分别叫做RealmeWatch2和RealmeWatch2Pro。现在,Rea……Sonnet发布Ehco11雷电4扩展坞预售价199。99美Sonnet刚刚发布了具有11个端口的雷电4扩展坞,它就是配备了四个向后兼容雷电口的Echo11。如果你正在使用M1Mac等雷电3设备,Echo11也能够带来完整的ldquo;……亚马逊BuildIt项目宣布三款新智能产品据外媒报道,亚马逊推出了一个名为BuildIt的新平台,这是期DayOneEditions项目的一部分。DayOneEditions专注于限量生产产品,从而在消费者购买新设备后……索尼PlayStation中国官宣国行PS5二季度上市全新的PlayStation5游戏主机开始在全球陆续上市已经有近3个月的时间了,但由于疫情的影响,索尼各代工厂产能严重不足以及黄牛疯狂囤货等种种原因,导致PS5在发售后ldqu……任天堂联手711在日本推出超级马里奥主题面包和甜点据外媒报道,如果你现在正在宇宙中寻找对玩家最友好的食物,那么你将会在日本找到最棒的选择也。今年,711便利店跟任天堂联手推出了多种超级马里奥主题面包和甜点。在本周开始的组合中,……中国移动联合多家单位发起成立信息通信测试仪器仪表专业委员会近日,中国移动研究院在北京牵头召开中国仪器仪表学会信息通信测试仪器仪表专业委员会(筹)第一次会议。中国工程院院士张平、中电科首席科学家兼科技部重大科学仪器设备开发重点专项专家组……高质量打造青海国际生态旅游目的地青海地处青藏高原东北部,作为中华水塔,其生态地位重要而特殊,多民族融合而聚居,具有生态省、高原省、资源省、民族省的省情特征。全国两会期间,全国政协委员、青海省工商联副主席韩文林……科学家开发滑动式背包减轻佩戴者的负担还能发电据外媒NewAtlas报道,背着一个又大又重的背包会让人很累。所以科学家们开发了一款背包,不仅号称可以减轻佩戴者的负担,还可以利用运动来发电。这个实验性的背包是由清华大学的一个……AppleWatchECG心电图功能接近澳大利亚批准澳大利亚卫生部门已经先行批准了AppleWatch的不规则心律通知,也就是AFib房颤提醒功能,可见在不久的将来苹果将会让这一区域的用户开始使用心电图相关功能。苹果在2018年……手机发展50年从砖头到口袋电脑新华社北京4月3日电1973年4月3日,美国摩托罗拉公司工程师马丁库珀用手机给在美国电话电报公司贝尔实验室工作的乔尔恩格尔打了一个电话,这是人类使用民用移动通信设备打通的第一个……三星被指侵权做伪公益,称系不慎混淆!曾屡陷侵权风波三星被指侵权知名公益品牌做伪公益,事件近日有了新进展。南都记者注意到,2月4日,三星(中国)投资有限公司(以下简称三星中国)发布一则澄清声明,称其此前举办的公益活动,因不慎造成……苹果混合现实头显细节曝光配备8K显示屏据国外媒体报道,不止一次有传言称,苹果正在开发自己的头显。如今,外媒报道称,传言中的苹果VR头显将配备两个8K显示屏,售价3000美元(19429。8元)。一份新的报道称……
去有风的地方是追逐大理的风,还是去沙溪摆烂?从2022年3月开拍到如今播出在即,电视剧《去有风的地方》创造了未播先火的一个新纪录。拍摄期间网上一波接一波的围观和讨论、一个接一个的热点的诞生,估计连剧方都感到始料未及。……特斯拉又没有刹住车!一次撞车尾,一次撞墙特斯拉汽车,又出事啦!因为踩不下汽车的刹车踏板,第一次是撞到自家车库里的另外一辆雷克萨斯汽车,开车的是有着17年驾龄的司机王女士;第二次是撞到自家车库里的后墙壁。开车的是有着长……中国或报复性出境旅游!东南亚热烈欢迎,美韩却难分一杯羹?12月26日,中国宣布将会有序恢复中国公民的出境旅游。消息公布后短短半个小时内,中国最大的在线旅游服务平台的国际航班和酒店住宿搜索量迅速飙升至三年以来的最高值。这就……东契奇39128独行侠18分逆转火箭获7连胜独行侠111106火箭获得7连胜,完成18分大逆转,后者遭遇4连败。戈登三分、波特连续突破,火箭领先开局。小哈达威连得5分,东契奇二次进攻,突破上篮,小哈达威再中三分,独……走过行业低谷,2023年全球面板业酝酿重组并购机会经历了2022年漫长的寒冬,全球显示面板业2023年有望迎来弱增长。中国大陆企业的面板出货面积在全球的占比2023年将进一步上升至六成,面板产品结构升级,行业兼并重组蕴藏机会。……隐藏在人体内的特殊能力可以预测未来,回忆过去当你在工作日接触到的普通环境中,你正在工作、学习或忙于其他日常琐事。当你抬头看时,你会突然发现你周围的一切都是如此的似曾相识,它发生在过去的某个时刻。它甚至会给你一种穿越……华为P60手机壳首曝!镜头模组设计很特别或搭载超大底主摄文名动科技在去年中旬的时候,华为发布了P50系列手机,但一直到现在,P系列依旧还没有更新。而在近期,网络上关于华为P60系列的消息逐渐多了起来,不少消息指明,其将在202……陕西第二大旅游城市,拥有3个AAAAA景点,面积是西安的3倍在中国,陕西是一个不能被忽视的省份,从地理位置来讲,它是连接我国西北的战略要地,从历史来说,它是不可抹去的一页,从能源来说,它拥有国内重要的煤矿、天然气和石油。许多人对于陕西的……传光伏逆变器厂商古瑞瓦特IPO获批产品性能比肩华为,高增长下【文观察者网吕栋李泽西】原计划2014年就要完成上市的光伏逆变器龙头古瑞瓦特(Growatt),在苦等8年之后,终于看到了IPO成功的曙光。这家来自深圳的公司在冲刺A股折……盘点香港影片6大恶人境遇,形象已深入人心,结局却大不相同每部经典影视作品里,都有一些令人气得牙痒痒的反派角色,尤其是在曾经的港片里,帅气主角的背后总有不少恶人。因为塑造的形象太深入人心,所以他们之中有不少人即使走出了片场还是让……浙江永康楼市的危机,金义都市区的永康房价,永康楼市的潜力浙江永康市是一座相当知名的县级城市,而现在的永康定位更是世界五金之都,只要与五金有关系的产品,几乎都有永康有一定关联。正是由于永康这座城市产业相当发达,所以永康当地的人均……3个方法,拯救你的失眠你知道吗?每五个人就有一个在一生中某个时期经历过失眠。什么是失眠?这是一种睡眠障碍,会降低你的生活质量和整体健康。一些患有失眠症的人难以入睡,而另一些人则难以长时间保持睡……
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网