1. 怎樣繪制java虛擬機
Java 代碼編譯是由 Java 源碼編譯器來完成,流程圖如下所示:
1)Bootstrap ClassLoader
負責載入$JAVA_HOME中jre/lib/rt.jar里所有的 class,由 C++ 實現,不是 ClassLoader 子類。
2)Extension ClassLoader
負責載入Java平台中擴展功能的一些 jar 包,包括$JAVA_HOME中jre/lib/ext/*.jar或-Djava.ext.dirs指定目錄下的 jar 包。
3)App ClassLoader
負責記載 classpath 中指定的 jar 包及目錄中 class。
4)Custom ClassLoader
屬於應用程序根據自身需要自定義的 ClassLoader,如 Tomcat、jboss 都會根據 J2EE 規范自行實現 ClassLoader。
載入過程中會先檢查類是否被已載入,檢查順序是自底向上,從 Custom ClassLoader 到 BootStrap ClassLoader 逐層檢查,只要某個 Classloader 已載入就視為已載入此類,保證此類只所有 ClassLoader載入一次。而載入的順序是自頂向下,也就是由上層來逐層嘗試載入此類。
類執行機制
JVM 是基於棧的體系結構來執行 class 位元組碼的。線程創建後,都會產生程序計數器(PC)和棧(Stack),程序計數器存放下一條要執行的指令在方法內的偏移量,棧中存放一個個棧幀,每個棧幀對應著每個方法的每次調用,而棧幀又是有局部變數區和操作數棧兩部分組成,局部變數區用於存放方法中的局部變數和參數,操作數棧中用於存放方法執行過程中產生的中間結果。棧的結構如下圖所示:
2. java 急求SpringMVC的工作原理的解釋和它的流程圖
Spring工作流程描述
1. 用戶向伺服器發送請求,請求被Spring 前端控制Servelt DispatcherServlet捕獲;
2.DispatcherServlet對請求URL進行解析,得到請求資源標識符(URI)。然後根據該URI,調用HandlerMapping獲得該Handler配置的所有相關的對象(包括Handler對象以及Handler對象對應的攔截器),最後以HandlerExecutionChain對象的形式返回;
3.DispatcherServlet 根據獲得的Handler,選擇一個合適的HandlerAdapter。(附註:如果成功獲得HandlerAdapter後,此時將開始執行攔截器的preHandler(...)方法)
4. 提取Request中的模型數據,填充Handler入參,開始執行Handler(Controller)。 在填充Handler的入參過程中,根據你的配置,Spring將幫你做一些額外的工作:
HttpMessageConveter: 將請求消息(如Json、xml等數據)轉換成一個對象,將對象轉換為指定的響應信息
數據轉換:對請求消息進行數據轉換。如String轉換成Integer、Double等
數據根式化:對請求消息進行數據格式化。 如將字元串轉換成格式化數字或格式化日期等
數據驗證: 驗證數據的有效性(長度、格式等),驗證結果存儲到BindingResult或Error中
5. Handler執行完成後,向DispatcherServlet返回一個ModelAndView對象;
6. 根據返回的ModelAndView,選擇一個適合的ViewResolver(必須是已經注冊到Spring容器中的ViewResolver)返回給DispatcherServlet;
7.ViewResolver 結合Model和View,來渲染視圖
8. 將渲染結果返回給客戶端。
Spring工作流程描述
為什麼Spring只使用一個Servlet(DispatcherServlet)來處理所有請求?
詳細見J2EE設計模式-前端控制模式
Spring為什麼要結合使用HandlerMapping以及HandlerAdapter來處理Handler?
符合面向對象中的單一職責原則,代碼架構清晰,便於維護,最重要的是代碼可復用性高。如HandlerAdapter可能會被用於處理多種Handler。
3. springboot啟動過程圖解(springboot的啟動流程圖)
springboot啟動過程是?總覽:
上圖為SpringBoot啟動結構圖,我們發現啟動流程主要分為三個部分,第一部分進行、SpringApplication的初始化模塊,配置一些基本的環境變數、資襪橘源、構造器、監聽器,第告世團二部分實現了應用具體的啟動方案,包括啟動流程的監聽模塊、載入配置環境模塊。
及核心的創建上下文環境模塊,第三部分是自動化配置模塊,該模塊作為springboot自動配置核心,在後面的分析中會詳細討論。在下面的啟動程序中我們會串聯起結構中的主要功能。
啟動:
每個SpringBoot程序都有一個主入口,也就是main方法,main裡面調用SpringApplication.run()啟動整個spring-boot程序,該方法所在類需要返雹使用@SpringBootApplication註解。
以及@ImportResource註解(ifneed),@SpringBootApplication包括三個註解,功能如下:@EnableAutoConfiguration:SpringBoot根據應用所聲明的依賴來對Spring框架進行自動配置。
@SpringBootConfiguration(內部為@Configuration):被標注的類等於在spring的XML配置文件中(applicationContext.xml),裝配所有bean事務,提供了一個spring的上下文環境。
@ComponentScan:組件掃描,可自動發現和裝配Bean,默認掃描SpringApplication的run方法里的Booter.class所在的包路徑下文件,所以最好將該啟動類放到根包路徑下。
springboot啟動流程是什麼?
首先貼一張很不錯的圖,SpringBoot啟動結構圖,圖片出自SpringBoot啟動流程解析。本文的分析基於SpringBoot2.1.5,非Spring的代碼只有下面這個啟。
提供大量優秀的Web框架方便開發等等。Spring框架具有控制反轉(IOC)特性,IOC旨在方便項目維護和測試,它提供了一種通過Java的反射機制對Java對象進行統一的配置和管理的方法。
Spring框架利用容器管理對象的生命周期,容器可以通過掃描XML文件或類上特定Java註解來配置對象,開發者可以通過依賴查找或依賴注入來獲得對象。
SpringBoot的啟動主要是通過實例化SpringApplication來啟動的。
啟虧豎胡動過程主要做了以下幾件事情:配置屬性、獲取監聽器,發布應用開始啟動事件初、始化輸入參數、配置環境,輸出banner、創建上下文、預處理上下文、刷新上下文(載入tomcat容器)、再刷新上下文、發布應用已經啟動事件、發布應用啟動完成事件。
在SpringBoot中啟動tomcat的工作在刷新上下這一步。
而tomcat的啟動主要是實例化兩個組件:Connector、Container,一個纖汪tomcat實例就是一個Server,一個Server包含多個Service,也就是多個應用程序,每個Service包含多個銷攔Connector和一個Container,而一個Container下又包含多個子容器。
springboot啟動流程springboot啟動流程如下:
啟動流程主要分為三個部分,第一部分進行、SpringApplication的初始化模塊,配置一些基本的環境變數、資源、構造器、監聽器,第二部分實現了應用具體的啟動方案,包括啟動流程的監聽模塊、載入配置環境模塊。
及核心的創建上下文環境模塊,第三部分是自枯譽動化配置模塊,該模塊衡襪作為springboot自動配置核心,在後面的分析中會詳細討論。在下面的啟動程序中我們會串沒攔段聯起結構中的主要功能。
啟動過程主要做了以下幾件事情:
配置屬性、獲取監聽器,發布應用開始啟動事件初、始化輸入參數、配置環境,輸出banner、創建上下文、預處理上下文、刷新上下文(載入tomcat容器)、再刷新上下文、發布應用已經啟動事件、發布應用啟動完成事件。
在SpringBoot中啟動tomcat的工作在刷新上下這一步。
而tomcat的啟動主要是實例化兩個組件:Connector、Container,一個tomcat實例就是一個Server,一個Server包含多個Service,也就是多個應用程序,每個Service包含多個Connector和一個Container,而一個Container下又包含多個子容器。
springboot啟動流程入口是一個main方法,這個main方法裡面new一個SpringApplication對象,傳入bean源,就是註解了SpringBootApplication的物爛那個類,調用run方法。
springboot啟動流程分為兩部分一部分是准備階段,一部分是運行階段
准備階段主要有這么幾步:
1、配置bean的源,就是bean的來源,就是註解了SpringBootApplication的那個類。
2、推斷,推斷應用類型,有webflux,webservlet,none
推斷主類,這個是通過線程堆棧實現,構造一個運行時異常絕笑,找異常堆棧裡面找mian所在的那個類。
3、載入上下文初始化器在這里可以調整applicationcontext
4、載入應用事件監聽器這兩個東西都是在mete-info/spring.factories文件裡面。
運行階段,就是調用run方法
先是載入SpringApplication運行時監聽器罩宏漏,SpringApplicationRunListeners,默認只有一個EventPublishingRunListener,需要傳入准備階段載入的listeners,在這個地方調用一個廣播器廣播事件。
然後會根據推斷類型,創建一個ApplicationContext,
對這個context初始化,refresh方法
最後會返回這個context。
自動裝配:
1、激活自動配置,EnableAutoConfiguration
2、實現自動配置(註解裝配,模式裝配,條件裝配)配置bean
3、將這個配置配置到spring.factories文件裡面去