老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)

SpringBootFatJar的啟動原理是什么

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)SpringBoot FatJar的啟動原理是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),扶余企業(yè)網(wǎng)站建設(shè),扶余品牌網(wǎng)站建設(shè),網(wǎng)站定制,扶余網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,扶余網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

URLStreamHandler

java中描述資源常使用URL。而URL有一個方法用于打開鏈接java.net.URL#openConnection()。由于URL用于表達(dá)各種各樣的資源,打開資源的具體動作由java.net.URLStreamHandler這個類的子類來完成。根據(jù)不同的協(xié)議,會有不同的handler實(shí)現(xiàn)。而JDK內(nèi)置了相當(dāng)多的handler實(shí)現(xiàn)用于應(yīng)對不同的協(xié)議。比如jarfilehttp等等。URL內(nèi)部有一個靜態(tài)HashTable屬性,用于保存已經(jīng)被發(fā)現(xiàn)的協(xié)議和handler實(shí)例的映射。

獲得URLStreamHandler有三種方法

  1. 實(shí)現(xiàn)URLStreamHandlerFactory接口,通過方法URL.setURLStreamHandlerFactory設(shè)置。該屬性是一個靜態(tài)屬性,且只能被設(shè)置一次。

  2. 直接提供URLStreamHandler的子類,作為URL的構(gòu)造方法的入?yún)⒅弧5窃贘VM中有固定的規(guī)范要求:

    1. 子類的類名必須是 Handler ,同時最后一級的包名必須是協(xié)議的名稱。比如自定義了Http的協(xié)議實(shí)現(xiàn),則類名必然為xx.http.Handler

    2. JVM 啟動的時候,需要設(shè)置 java.protocol.handler.pkgs 系統(tǒng)屬性,如果有多個實(shí)現(xiàn)類,那么中間用 | 隔開。因?yàn)镴VM在嘗試尋找Handler時,會從這個屬性中獲取包名前綴,最終使用包名前綴.協(xié)議名.Handler,使用Class.forName方法嘗試初始化類,如果初始化成功,則會使用該類的實(shí)現(xiàn)作為協(xié)議實(shí)現(xiàn)。

Archive

SpringBoot定義了一個接口用于描述資源,也就是org.springframework.boot.loader.archive.Archive。該接口有兩個實(shí)現(xiàn),分別是org.springframework.boot.loader.archive.ExplodedArchiveorg.springframework.boot.loader.archive.JarFileArchive。前者用于在文件夾目錄下尋找資源,后者用于在jar包環(huán)境下尋找資源。而在SpringBoot打包的fatJar中,則是使用后者。

打包

SpringBoot使用插件


                org.springframework.boot
                spring-boot-maven-plugin
                
                    com.tccdemo.Eureka
                
            

進(jìn)行打包,打包后的文件布局如下:

SpringBoot FatJar的啟動原理是什么

  1. BOOT-INF文件夾下放的程序編譯class和依賴的jar包

  2. org目錄下放的是SpringBoot的啟動相關(guān)包。

來看描述文件MANIFEST.MF的內(nèi)容

Manifest-Version: 1.0
Implementation-Title: eureka
Implementation-Version: 1.0-SNAPSHOT
Built-By: Administrator
Implementation-Vendor-Id: com.tccdemo
Spring-Boot-Version: 2.0.2.RELEASE
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.tccdemo.Eureka
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Created-By: Apache Maven 3.6.1
Build-Jdk: 1.8.0_201
Implementation-URL: http://www.example.com

最為顯眼的就是程序的啟動類并不是我們項(xiàng)目的啟動類,而是SpringBoot的JarLauncher。下面會來深究下這個類的作用。

SpringBoot啟動

首先來看啟動方法

public static void main(String[] args) throws Exception {
  new JarLauncher().launch(args);
}

JarLauncher繼承于org.springframework.boot.loader.ExecutableArchiveLauncher。該類的無參構(gòu)造方法最主要的功能就是構(gòu)建了當(dāng)前main方法所在的FatJar的JarFileArchive對象。下面來看launch方法。該方法主要是做了2個事情:

  1. 以FatJar為file作為入?yún)ⅲ瑯?gòu)造JarFileArchive對象。獲取其中所有的資源目標(biāo),取得其Url,將這些URL作為參數(shù),構(gòu)建了一個URLClassLoader。

  2. 以第一步構(gòu)建的ClassLoader加載MANIFEST.MF文件中Start-Class指向的業(yè)務(wù)類,并且執(zhí)行靜態(tài)方法main。進(jìn)而啟動整個程序。

通過靜態(tài)方法org.springframework.boot.loader.JarLauncher#main就可以順利啟動整個程序。這里面的關(guān)鍵在于SpringBoot自定義的classLoader能夠識別FatJar中的資源,包括有:在指定目錄下的項(xiàng)目編譯class、在指令目錄下的項(xiàng)目依賴jar。JDK默認(rèn)用于加載應(yīng)用的AppClassLoader只能從jar的根目錄開始加載class文件,并且也不支持jar in jar這種格式。

為了實(shí)現(xiàn)這個目標(biāo),SpringBoot首先從支持jar in jar中內(nèi)容讀取做了定制,也就是支持多個!/分隔符的url路徑。SpringBoot定制了以下兩個方面:

  1. 實(shí)現(xiàn)了一個java.net.URLStreamHandler的子類org.springframework.boot.loader.jar.Handler。該Handler支持識別多個!/分隔符,并且正確的打開URLConnection。打開的Connection是SpringBoot定制的org.springframework.boot.loader.jar.JarURLConnection實(shí)現(xiàn)。

  2. 實(shí)現(xiàn)了一個java.net.JarURLConnection的子類org.springframework.boot.loader.jar.JarURLConnection。該鏈接支持多個!/分隔符,并且自己實(shí)現(xiàn)了在這種情況下獲取InputStream的方法。而為了能夠在org.springframework.boot.loader.jar.JarURLConnection正確獲取輸入流,SpringBoot自定義了一套讀取ZipFile的工具類和方法。這部分和ZIP壓縮算法規(guī)范緊密相連,就不深入了。

能夠讀取多個!/的url后,事情就變得很簡單了。上文提到的ExecutableArchiveLauncherlaunch方法會以當(dāng)前的FatJar構(gòu)建一個JarFileArchive,并且通過該對象獲取其內(nèi)部所有的資源URL,這些URL包含項(xiàng)目編譯class和依賴jar包。在構(gòu)建這些URL的時候傳入的就是SpringBoot定制的Handler。將獲取的URL數(shù)組作為參數(shù)傳遞給自定義的ClassLoaderorg.springframework.boot.loader.LaunchedURLClassLoader。該ClassLoader繼承自UrlClassLoader。UrlClassLoader加載class就是依靠初始參數(shù)傳入的Url數(shù)組,并且嘗試Url指向的資源中加載Class文件。有了自定義的Handler,再從Url中嘗試獲取資源就變得很容易了。

至此,SpringBoot自定義的ClassLoader就能夠加載FatJar中的依賴包的class文件了。

擴(kuò)展

SpringBoot提供了一個很好的思路,但是其內(nèi)部實(shí)現(xiàn)非常復(fù)雜,特別是其自行實(shí)現(xiàn)了一個ZipFIle的解析器。但是本質(zhì)上這些背后的工作都是為了能夠讀取到FatJar內(nèi)部的Jar的class文件資源。也就是只要有辦法能夠讀取這些資源其實(shí)就可以實(shí)現(xiàn)加載Class文件了。而依靠JDK本身提供的JarFile其實(shí)就可以做到了。而讀取到所有資源后,自定義一個ClassLoader加載讀取到二進(jìn)制數(shù)據(jù)進(jìn)而定義Class對象并不是很難的項(xiàng)目實(shí)現(xiàn)。當(dāng)然,SpringBoot定制的Zip解析可以在加載類階段避免頻繁的文件解壓動作,在性能上良好一些。


上述就是小編為大家分享的SpringBoot FatJar的啟動原理是什么了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


名稱欄目:SpringBootFatJar的啟動原理是什么
文章來源:http://www.xueling.net.cn/article/ijhoip.html

其他資訊

在線咨詢
服務(wù)熱線
服務(wù)熱線:028-86922220
TOP
主站蜘蛛池模板: 91麻豆国产福利精品 | 色哟哟国产精品免费观看 | 国产日产欧产精品精乱了派 | 一级片子 | 女人与拘做受AAAAA片 | 免费国精产品—品二品 | 欧美日韩国产一区二区三区不卡 | 久久久久青草 | 欧美成年视频在线观看 | 中文字幕无码热在线视频 | 日韩高清不卡一区 | 国内精品九九久久久精品 | 国产不卡av在线播放 | 欧洲最大免费看影视网站 | 久久色成人在线 | 中国xxxx真实自拍 | 国产在线观看99 | 国产一区三区在线播放 | 国产在线高清精品 | 韩日免费视频 | 国产亚洲欧洲一区二区三区 | 亚洲国产不卡视频 | 中文在线资源 | 亚洲激情四射视频中文字幕久久 | 日韩精品欧美激情 | 军歌嘹亮在线观看 | 亚洲国产精品久久久久秋霞小 | 日韩亚射吧 | 亚洲国产精品女人久久久 | 老太婆性杂交欧美肥老太 | 91大神夯51部在线观看 | 999久久久精品视频 久久久经典视频 | 97伦理| 激情超碰 | 日本一卡二卡3卡四卡网站精品 | 中文字幕精品在线观看 | 久久九九视频 | 亚洲AV无码国产成人 | 思思99热精品免费观看 | 亚洲色大成网站www 久久久久91 | 欧美国产亚洲精品 |