城市直播房产教育博客汽车
快传网
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

你真的了解SpringBoot应用的启动入口么?

3月11日 终离去投稿
  Springboot可以说是Java程序员必备技能了,大家都知道Springboot最终可以通过maven打成jar包,然后直接使用javajar命令运行一个Web工程(或其它)。这样就避免了原先基于tomcat的web工程的复杂操作。Springboot能够使Web服务的部署简单到如此程度是因为其内置了Jetty(或Tomcat)服务器,并且在容器启动过程中start该服务器,成功运行Web服务。
  本篇并不是深究内置服务器的启动过程,而是追溯Springboot启动之前到底做了什么?它是如何与我们经常写的SpringBootApplication注解注释的main方法类绑定起来的?1、一切的开始
  相信各位Springbooter一定不会陌生下面的代码,无论是初学Springboot的新同学,或是开始研究Springboot源码的新司机,这段代码几乎是我们的落脚点。我们如此熟悉它,以至于认为它就是Springboot这个魔法乐园的起点。但真的是这样吗?SpringBootApplicationpublicclassSpringboot01helloworldApplication{publicstaticvoidmain(String〔〕args){SpringApplication。run(Springboot01helloworldApplication。class,args);}}复制代码
  我们都知道,一个Java工程打包过后,这个jar包的入口描述被写在了METAINFMANIFEST。MF文件下,下面让我们来看看这个文件内容:ManifestVersion:1。0ArchiverVersion:PlexusArchiverBuiltBy:MrXuStartClass:com。vivo。internet。nex。repeater。console。RepeaterConsoleApplicationSpringBootClasses:BOOTINFclassesSpringBootLib:BOOTINFlibSpringBootVersion:1。5。19。RELEASECreatedBy:ApacheMaven3。8。1BuildJdk:1。8。0281MainClass:org。springframework。boot。loader。JarLauncher复制代码
  文件入口的描述为MainClass对应的value,即org。springframework。boot。loader。JarLauncher。那么,接下来我们需要看下这个人类究竟做了什么?JarLauncher。javapublicclassJarLauncherextendsExecutableArchiveLauncher{staticfinalStringBOOTINFCLASSESBOOTINFstaticfinalStringBOOTINFLIBBOOTINFpublicJarLauncher(){}。。。省略无关代码publicstaticvoidmain(String〔〕args)throwsException{(newJarLauncher())。launch(args);}}复制代码
  明显的main函数吸引了我们的注意,没错了,这就是入口,看看JarLauncher的空构造并没有任何代码,我们先往它的父类找找:ExecutableArchiveLauncher。javapublicabstractclassExecutableArchiveLauncherextendsLauncher{publicExecutableArchiveLauncher(){try{this。archivethis。createArchive();}catch(Exceptionvar2){thrownewIllegalStateException(var2);}}。。。省略}Launcher。javapublicabstractclassLauncher{publicLauncher(){}。。。省略无关代码}复制代码
  从代码中可以看出,真正干了事情的父类是ExecutableArchiveLauncher,它在初始化时构造了archive实例,该实例封装了METAINFMANIFEST。MF文件的信息。后面我们也会用到它。
  随后便是launch方法,我们只关系核心执行流程:Launcher。javaprotectedvoidlaunch(String〔〕args)throwsException{JarFile。registerUrlProtocolHandler();ClassLoaderclassLoaderthis。createClassLoader(this。getClassPathArchives());this。launch(args,this。getMainClass(),classLoader);}ExecutableArchiveLauncher。javaprotectedStringgetMainClass()throwsException{Manifestmanifestthis。archive。getManifest();StringmainCif(manifest!null){mainClassmanifest。getMainAttributes()。getValue(StartClass);}if(mainClassnull){thrownewIllegalStateException(NoStartClassmanifestentryspecifiedinthis);}else{returnmainC}}复制代码
  这里首先调用子类ExecutableArchiveLauncher的getMainClass方法,主要逻辑就是从METAINFMANIFEST。MF文件中获取StartClass信息,对应上文就是com。vivo。internet。nex。repeater。console。RepeaterConsoleApplication字符串,这样就和我们写的启动类关联上了。
  然后是launch方法的具体执行,launch()首先创建一个MainMethodRunner,将上文获取的StartClass和透传的参数传递进去,然后调用MainMethodRunner的run方法。run方法的执行也非常简单,就是加载StartClass对应的启动类,然后反射调用启动类的main方法。之后就是容器的初始化过程了。Launcher。javaprotectedvoidlaunch(String〔〕args,StringmainClass,ClassLoaderclassLoader)throwsException{Thread。currentThread()。setContextClassLoader(classLoader);这里首先调用createMainMethodRunner创建一个MainMethodRunner实例,将mainClass和args参数传入。随后调用this。createMainMethodRunner(mainClass,args,classLoader)。run();}protectedMainMethodRunnercreateMainMethodRunner(StringmainClass,String〔〕args,ClassLoaderclassLoader){returnnewMainMethodRunner(mainClass,args);}MainMethodRunner。javapublicMainMethodRunner(StringmainClass,String〔〕args){this。mainClassNamemainCthis。argsargs!null?(String〔〕)args。clone():}publicvoidrun()throwsException{C?mainClassThread。currentThread()。getContextClassLoader()。loadClass(this。mainClassName);MethodmainMethodmainClass。getDeclaredMethod(main,String〔〕。class);mainMethod。invoke((Object)null,this。args);}复制代码2、总结
  综上所述,对于Springboot工程,启动类并不是真正的工程入口,他会被真正的入口反射调用其main方法实现Spring容器的启动。工程入口也是Spring的开发人员为我们营造的一种假象,抽象出来的逻辑入口。
  作者:Chub
  链接:https:juejin。cnpost7100386958580563982
投诉 评论 转载

海信TOUCH音乐阅读器让阅读在音乐中沉醉我们每个人在生活当中会遇到很多烦心事,比如工作上联系好久的客户被别人挖走等。这些事情琐碎而又让人头疼情绪低落。当我们情绪低落的时候,不妨试一试多读读书或者听听音乐,这是一个能让……中国第一颗7nm制程的车规级SOC芯片今年以来,芯片短缺问题日趋严重,不仅影响到了数码产品的研发销售进度,甚至严重困扰汽车业,众多国内外车企因此多次减产甚至停产。近期,由于东南亚地区疫情反复,汽车芯片短缺状况进一步……苹果iOS15。2验证通道关闭,iPhone升级iOS15。苹果iOS15。2验证通道关闭,iPhone升级iOS15。2。1正式版后无法再降级1月20日消息,在本月早些时候发布iOS15。2。1之后,苹果今日停止为所有iPhon……B85主板是不是很老了,i54590直播游戏很吃力!怎么升级卖掉,换新直播游戏需要多线程,换成四核八线程的E31231V3试试硬盘是固态的吗?显卡什么型号?电脑是木桶效应,CPU问题不是特别大,建议升级内存,显卡,固态,肯定……今天才发现!长按微信2秒,还可以解锁13个隐藏功能,太赞了分享最实在的玩机技巧,洞察最前沿的科技资讯!大家好,这里是手机科技园!生活中我们每天都会用到微信,它可以用来社交、办公以及支付。今天才发现,如果我们长按微信2秒,还可以解……把滴滴特惠全关了,收入流水受影响是不是很大?自从关了滴滴的远程特惠、特惠快车这等坑人的功能,跑车心情比以前好多了。除非到了偏远地区,打开特惠就当顺风车了,回去立马关了。还有就是特惠奖励多、好完成的时候开一下,奖励到手立马……中新财评道歉不是奥迪广告抄袭事件的终点中新财经5月22日电奥迪小满广告抄袭一事刷屏。22日,奥迪发布声明就该事件中因监管不力、审核不严向刘德华、北大满哥及相关方致歉,并下架相关视频。违法侵权,不是小事。事件的……苹果最后的底线iPhone开放侧载?没这个可能如果要问各位选择苹果产品的理由是什么,我相信很多人都会给出相对安全、健康的生态环境这条理由,用过安卓手机的应该都体会过无处不在的广告陷阱,年轻人防范意识可能较强,误触可能性较低……互联网大裁员,是人员过剩了,还是市场饱和了?主要是红利期已过互联网的红利期已过,企业进入到天花板阶段。其主要体现为:中国人口出生率持续降低,人口加剧进入老龄化时代,一二线互联网基本完成网民覆盖,用户规模触达增长的天……魅蓝回归,价格战或再起,国内消费者有望买到实惠的手机久无声息的魅族,近日宣布魅蓝回归,一下子引发了消费者对这家手机企业的关注,柏铭科技认为魅蓝回归的最大希望就中低端手机市场,这将引发新一轮手机价格大战,这对于国内消费者来说无疑是……你真的了解SpringBoot应用的启动入口么?Springboot可以说是Java程序员必备技能了,大家都知道Springboot最终可以通过maven打成jar包,然后直接使用javajar命令运行一个Web工程(或其它……OPPOReno7Pro测评买了暮雪金感觉不好看,有点后悔,唉这个颜色买错了,这个颜色不太好看,就在阳光下有这种幻彩的感觉,市内颜色根本就是个乳白色,没有蓝色好看,给小伙伴参考,没有6的紫色好看,对于我这种只看颜值的人来说,这次踩坑了,……
星巴克中国内地首家共享空间概念店上海开业加拿大鹅将在哈尔滨南4G远程监控摄像头一个月多少流量4G无网监控器每月多少钱一拖四还带充电,扩充你局促的笔记本电脑接口,aigoH4分线618省钱攻略最高直降1800!全网最低价iPhone12在系统推进,全面激发数字经济活力电动四轮要驾照吗?官方明确答复,不再0门槛上路,有3个要求女生的手机里都有什么软件?成者磁吸无线充鼠标垫,极匠精神,打造完美本地生活阿里巴巴入局,新增爆爆团项目,开启到店团购服务在医院手术室,医生都不穿内裤,患者不准穿衣服?看医生说出实情三星GalaxyWatch5Pro将采用钛合金材质全面超越iPhone,华为MateXs2折叠屏手机到底有多香
怀孕可以吃西瓜吗吃西瓜要注意哪方面问题热博聚热点网 欧莱克热水器怎么样欧莱克即热式电热水器优势介绍爸爸,你为什么不早点回来长沙值得一去的旅游景点有哪些为什么今年这么难(三)年轻人集体躺平学习计划嘴唇周围长痘痘是什么原因(嘴边的痘痘为什么反复的长)2023兔年优美别致清新靓丽的女孩名字你好我骑她上面是啥体位美好的意外主题曲歌词冬日的暖阳怎么鉴别蓝田玉如何鉴别蓝田玉

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找江西南阳嘉兴昆明铜陵滨州广东西昌常德梅州兰州阳江运城金华广西萍乡大理重庆诸暨泉州安庆南充武汉辽宁