电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

三分鐘帶你了解SpringBoot真正的啟動引導類

瀏覽:4日期:2023-04-12 13:23:38

引言

SpringBoot項目中的啟動類,一般都是XXApplication,例如**「StatsApplication」「UnionApplication」**。

每個項目的啟動類名稱都不一樣。但是它的啟動類真的是XXApplication嗎?

三分鐘帶你了解SpringBoot真正的啟動引導類

**META-INF/**Manifest.mf文件

jar文件實際上是class文件的zip壓縮存檔。jar并不能表達應用程序的便簽信息.

「META-INF/Manifest.mf文件提供存檔的便簽信息.」

Manifest.mf有 「Main-Class,用來標明jar文件的入口類。」

解壓jar包,查看META-INF/Manifest.mf過程如下:

三分鐘帶你了解SpringBoot真正的啟動引導類

重要信息如下

Main-Class: org.springframework.boot.loader.JarLauncherStart-Class: com.shanyuan.StatsApplication

也就是說:「org.springframework.boot.loader.JarLauncher 是 SpringBoot 的啟動類!」

下面瀏覽下 JarLauncher

瀏覽JarLauncher

3.1 找到JarLauncher

進入IDEA,Ctrl+N查找JarLauncher,竟然找不到!!

三分鐘帶你了解SpringBoot真正的啟動引導類

進入 https://search.maven.org/classic/#advancedsearch 查詢JarLauncher

三分鐘帶你了解SpringBoot真正的啟動引導類

在查詢結果找到spring下的項目

三分鐘帶你了解SpringBoot真正的啟動引導類

確定 JarLauncher 位于 spring-boot-loader 下。為了方便查看源碼,在 pom 中引入

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-loader</artifactId> <scope>provided</scope></dependency>

3.2.JarLauncher說明

JarLauncher作為引導類 ,當調用java -jar 命令時,將調用 main 方法,實際上調用的是 **「JarLauncher#launch」**方法,該方法繼承于 org.springframework.boot.loader.Launcher

簡化層次關系為:

三分鐘帶你了解SpringBoot真正的啟動引導類

JarLauncher#launch代碼如下

protected void launch(String[] args) throws Exception { JarFile.registerUrlProtocolHandler(); ClassLoader classLoader = createClassLoader(getClassPathArchives()); launch(args, getMainClass(), classLoader);}

「聚句解析」

「1,.JarFile.registerUrlProtocolHandler();」

Spring Boot 生成的 FAT jar,在被 java -jar 引導時,其內部的 jar 文件無法被 sun.net.www.protocol.jar.Handler 處理。微信公眾號搜索, [Java學習之道] ,回復 ‘福利’ 2T 資料等你來拿~

所以 SpringBoot 實現了,org.springframework.boot.loader.jar.Handler

JarFile.registerUrlProtocolHandler(), 就注冊 org.springframework.boot.loader.jar.Handler

「2.ClassLoader classLoader = createClassLoader(getClassPathArchives());」

創建ClassLoader。

getClassPathArchives 核心判斷是 isNestedArchive 方法。

isNestedArchive 被 JarLauncher 覆寫了。其實現如下:

static final String BOOT_INF_CLASSES = 'BOOT-INF/classes/';static final String BOOT_INF_LIB = 'BOOT-INF/lib/';@Overrideprotected boolean isNestedArchive(Archive.Entry entry) { if (entry.isDirectory()) { return entry.getName().equals(BOOT_INF_CLASSES); } return entry.getName().startsWith(BOOT_INF_LIB);}

也就是說,只要 **「滿足以BOOT-INF/classes/和BOOT-INF/lib/都是classLoader加載」**的范圍。

解壓的jar,查看也與只對應

三分鐘帶你了解SpringBoot真正的啟動引導類

3. launch(args, getMainClass(), classLoader);

protected void launch(String[] args, String mainClass, ClassLoader classLoader) throws Exception { Thread.currentThread().setContextClassLoader(classLoader); createMainMethodRunner(mainClass, args, classLoader).run();}

查看 createMainMethodRunner 的 run 方法,如下:

public class MainMethodRunner { // 省略部分代碼 public void run() throws Exception { Class<?> mainClass = Thread.currentThread().getContextClassLoader() .loadClass(this.mainClassName); Method mainMethod = mainClass.getDeclaredMethod('main', String[].class); mainMethod.invoke(null, new Object[] { this.args }); }}

其中 mainClass,來自 /META-INF/MANIFEST.MF 中的 Start-Class 屬性。

「即,JarLauncher 是同進程內,通過反射調用 Start-Class 對應類,即 XXXApplication 的 main 方法。」

4.總結

SpringBoot 項目的實際啟動類是 org.springframework.boot.loader.JarLauncher。

「在 JarLauncher 內部通過反射調用 XXApplication 類的 main 方法。具體實現位于 MainMethodRunner中。」

到此這篇關于三分鐘帶你了解SpringBoot真正的啟動引導類的文章就介紹到這了,更多相關SpringBoot 啟動引導類內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 液氮罐(生物液氮罐)百科-无锡爱思科| 精密机械零件加工_CNC加工_精密加工_数控车床加工_精密机械加工_机械零部件加工厂 | 陕西安闸机-伸缩门-车牌识别-广告道闸——捷申达门业科技 | 交变/复合盐雾试验箱-高低温冲击试验箱_安奈设备产品供应杭州/江苏南京/安徽马鞍山合肥等全国各地 | 武汉印刷厂-不干胶标签印刷厂-武汉不干胶印刷-武汉标签印刷厂-武汉标签制作 - 善进特种标签印刷厂 | 深圳湾1号房价_深圳湾1号二手房源 | 小区健身器材_户外健身器材_室外健身器材_公园健身路径-沧州浩然体育器材有限公司 | 不锈钢轴流风机,不锈钢电机-许昌光维防爆电机有限公司(原许昌光维特种电机技术有限公司) | 桌上式超净工作台-水平送风超净工作台-上海康路仪器设备有限公司 | 重庆网站建设,重庆网站设计,重庆网站制作,重庆seo,重庆做网站,重庆seo,重庆公众号运营,重庆小程序开发 | 远程会诊系统-手术示教系统【林之硕】医院远程医疗平台 | 彼得逊采泥器-定深式采泥器-电动土壤采样器-土壤样品风干机-常州索奥仪器制造有限公司 | HDPE土工膜,复合土工膜,防渗膜价格,土工膜厂家-山东新路通工程材料有限公司 | 定做大型恒温循环水浴槽-工业用不锈钢恒温水箱-大容量低温恒温水槽-常州精达仪器 | 定时排水阀/排气阀-仪表三通旋塞阀-直角式脉冲电磁阀-永嘉良科阀门有限公司 | RO反渗透设备_厂家_价格_河南郑州江宇环保科技有限公司 | 5nd音乐网|最新流行歌曲|MP3歌曲免费下载|好听的歌|音乐下载 免费听mp3音乐 | 企典软件一站式企业管理平台,可私有、本地化部署!在线CRM客户关系管理系统|移动办公OA管理系统|HR人事管理系统|人力 | 海峰资讯 - 专注装饰公司营销型网站建设和网络营销培训 | 万烁建筑设计院-建筑设计公司加盟,设计院加盟分公司,市政设计加盟 | 氮化镓芯片-碳化硅二极管 - 华燊泰半导体 | 铆钉机|旋铆机|东莞旋铆机厂家|鸿佰专业生产气压/油压/自动铆钉机 | 【电子厂招聘_普工招工网_工厂招聘信息平台】-工立方打工网 | 诺冠气动元件,诺冠电磁阀,海隆防爆阀,norgren气缸-山东锦隆自动化科技有限公司 | 高效复合碳源-多核碳源生产厂家-污水处理反硝化菌种一长隆科技库巴鲁 | 新能源汽车电机定转子合装机 - 电机维修设备 - 睿望达 | 扬尘在线监测系统_工地噪声扬尘检测仪_扬尘监测系统_贝塔射线扬尘监测设备「风途物联网科技」 | 存包柜厂家_电子存包柜_超市存包柜_超市电子存包柜_自动存包柜-洛阳中星 | 移动机器人产业联盟官网| 浙江华锤电器有限公司_地磅称重设备_防作弊地磅_浙江地磅售后维修_无人值守扫码过磅系统_浙江源头地磅厂家_浙江工厂直营地磅 | 山东集装箱活动房|济南集装箱活动房-济南利森集装箱有限公司 | 杭州ROHS检测仪-XRF测试仪价格-百科| 防火卷帘门价格-聊城一维工贸特级防火卷帘门厂家▲ | 车牌识别道闸_停车场收费系统_人脸识别考勤机_速通门闸机_充电桩厂家_中全清茂官网 | 无锡门窗-系统门窗-阳光房-封阳台-断桥铝门窗厂[窗致美] | 奇酷教育-Python培训|UI培训|WEB大前端培训|Unity3D培训|HTML5培训|人工智能培训|JAVA开发的教育品牌 | 缝纫客| 办公室装修_上海办公室设计装修_时尚办公新主张-后街印象 | 手持式线材张力计-套帽式风量罩-深圳市欧亚精密仪器有限公司 | 云南丰泰挖掘机修理厂-挖掘机维修,翻新,再制造的大型企业-云南丰泰工程机械维修有限公司 | 无锡不干胶标签,卷筒标签,无锡瑞彩包装材料有限公司 |