熱部署與熱加載:
熱部署和熱加載都是基于類(lèi)加載器實(shí)現(xiàn)的踱承,熱加載是服務(wù)器監(jiān)聽(tīng)class等文件的改變?nèi)缓髮?duì)改變的文件進(jìn)行局部加載,所以不會(huì)刪除session,也不會(huì)釋放內(nèi)存进每。熱部署就是全局部署,會(huì)清空session以及釋放內(nèi)存射亏。
類(lèi)加載機(jī)制:
java類(lèi)加載器主要有:
根類(lèi)加載器(Bootstrap ClassLoader) 一般加載%JAVA_HOME%/jre/lib下的一些jar包的class文件
擴(kuò)展類(lèi)加載器(Extension ClassLoader) 一般加載%JAVA_HOME%/jre/lib/ext中jar包的class文件
系統(tǒng)類(lèi)加載器(System?ClassLoader) 一般加載來(lái)自java命令的-classpath指定的jar包和類(lèi)路徑
自定義加載器(User ClassLoader) 用戶自定義的加載器近忙,默認(rèn)的父加載器是系統(tǒng)類(lèi)加載器
這些加載器有一個(gè)雙親委派的機(jī)制,就是說(shuō)智润,當(dāng)一個(gè)加載器接收到請(qǐng)求及舍,他會(huì)委托他的父類(lèi)加載器去加載。如果父類(lèi)找不到窟绷,他才會(huì)去加載锯玛。舉個(gè)栗子,java.lang.String 類(lèi),如果是系統(tǒng)類(lèi)加載器接到請(qǐng)求攘残,他會(huì)委托給擴(kuò)展類(lèi)加載器拙友,擴(kuò)展類(lèi)加載器會(huì)委托給根類(lèi)加載器,因?yàn)閖ava.lang.String.class是在%JAVA_HOME%/jre/lib/rt.jar下歼郭,所以最終由根類(lèi)加載器加載到JVM內(nèi)存
類(lèi)加載的階段:
加載:將類(lèi)的class文件讀入內(nèi)存遗契,并創(chuàng)建一個(gè)java.lang.Class對(duì)象放入方法區(qū)
驗(yàn)證:檢測(cè)被加載的類(lèi)是否有正確的內(nèi)部結(jié)構(gòu),會(huì)不會(huì)威脅虛擬機(jī)的安全等
準(zhǔn)備:為static修飾的變量分配內(nèi)存病曾,并設(shè)置初始值牍蜂,int型的是0,如果是static final修飾的泰涂,則進(jìn)入常量池
解析:將類(lèi)的二進(jìn)制數(shù)據(jù)中的符號(hào)引用替換為直接引用鲫竞。
初始化:當(dāng)初始化一個(gè)類(lèi)的時(shí)候,如果發(fā)現(xiàn)其父類(lèi)還沒(méi)有進(jìn)行過(guò)初始化逼蒙、則需要先觸發(fā)其父類(lèi)的初始化从绘,將準(zhǔn)備階段的初始值完成賦值。初始化運(yùn)行主類(lèi)其做,比如main方法顶考。
tomcat熱部署實(shí)現(xiàn)方式:
1.直接把項(xiàng)目的web文件夾放在webapps里
2.在tomcat/conf/server.xml的<host>里添加<context>
<Context?docBase="xxx"?path="/xxx"?reloadable="true"/>
其中docBase是你項(xiàng)目的web文件夾所在的目錄,path是用來(lái)在瀏覽器訪問(wèn)項(xiàng)目的虛擬路徑妖泄。
3.在tomcat/conf/Catalina/localhost/下添加一個(gè)xml驹沿,內(nèi)容如下
<?xml version="1.0" encoding="UTF-8"?>
<Context?docBase="xxx" reloadable="true"/>
其中docBase和reloadable跟第二步一樣,而項(xiàng)目訪問(wèn)的虛擬路徑是這個(gè)xml文件的文件名蹈胡。
SpringBoot實(shí)現(xiàn)熱加載
1.springloaded方式: 通過(guò)在maven的plug里加springloaded依賴(lài)
注意這種方式只能通過(guò)maven的方式去啟動(dòng)渊季。在idea編輯器里可以配置maven啟動(dòng)
注意maven啟動(dòng)命令是mvn spring-boot:run 但是idea已經(jīng)默認(rèn)前面加了mvn,所以這里配置不需要再寫(xiě)mvn了罚渐。
2.通過(guò)spring-boot-devtools方式: 在maven添加依賴(lài)
注意用idea編輯器的却汉,idea實(shí)現(xiàn)熱加載還需要修改兩個(gè)地方配置
這個(gè)要勾選上
然后按shift+alt+ctrl+/?
這個(gè)勾選上。到此就ok了荷并。
自定義加載器實(shí)現(xiàn)熱加載
用戶自定義加載器需要繼承ClassLoader合砂,實(shí)現(xiàn)原理就是通過(guò)一個(gè)線程去監(jiān)聽(tīng)文件的修改時(shí)間,然后重寫(xiě)findClass方法源织,把文件以流的形式讀進(jìn)來(lái)翩伪,然后調(diào)defineClass方法。在JDK1.2之后谈息,雙親委派模式已經(jīng)被引入到類(lèi)加載體系中缘屹,因此不建議重寫(xiě)loadClass方法,只需要重寫(xiě)findClass就可以了
這里是重寫(xiě)findClass核心代碼侠仇。