1. 程式人生 > 實用技巧 >「Spring Boot 2.4 新特性」啟動耗時詳細監控

「Spring Boot 2.4 新特性」啟動耗時詳細監控

跟光磊學Java開發-Java概述與開發環境搭建

跟光磊學Java開發

Java語言概述


James Golsing

Java語言發展史

  • 起源
    1991年,SUN(Standford University Network)公司的James Golsing領導的工程師小組想要開發一種用於像有線電視機頂盒這樣的消費類電子產品的小型計算機語言,該產品的特點是由於不同的廠商選擇不同的CPU和作業系統,因此要求該語言不能和特定的體系結構繫結在一起,也就是跨平臺的。最初將這個語言命名為Oak,然後發現已經有一種語言叫這個名字,然後改為Java。

  • 流行
    20世紀90年代末,Java趕上了網際網路發展的潮流,而網際網路的特點剛好和消費類嵌入式電子產品類似(不同計算機產商選擇不同的CPU和作業系統),得益於Java的跨平臺特性,可以製作在支援Java的Web瀏覽器內的程式(Applet)而逐漸流行起來。

  • 生態
    由於Java開源,也得到了許多大廠(例如Oracle,IBM,阿里巴巴,谷歌,蘋果)的支援,逐步發展成為具有開源、跨平臺、高效能、支援多執行緒、分散式、安全可靠等諸多特性的開發平臺和執行平臺,而且自JDK1.4以後逐漸湧現出許多為了簡化企業級開發的開源框架,例如後期會學習的Spring Framework,MyBatis,Netty,Dubbo等等都是使用Java實現,開發者可以通過閱讀Java和框架的原始碼來提高自身的程式設計功力。

  • 開發平臺
    經過20多年(1995年正式對外公開發布)的發展已經逐步建立起自己強大的生態體系,在大型網際網路應用開發,移動端Android開發以及大資料開發佔據了廣闊的市場,最典型的就是國內網際網路巨頭-阿里巴巴在其電商、物流、金融、支付、大資料、雲端計算等業務場景中大量使用了Java及其相關技術棧(Spring Framework/Spring Boot/Spring Cloud/Alibaba-Spring-Cloud,Hadoop,Spark,Flink/Android)。

  • 執行平臺
    Java程式是執行在JVM(Java Virtual Machine)之上的,這就是Java程式跨平臺實現的本質原因,而且由於Java的開放性,有越來越多的語言是執行在JVM之上的,例如大資料處理語言Scala,Android開發的Kotlin以及Clojure,Groovy等等。

Java的特性

Java是基於C/C基礎之上發展而來,但是不同於C/C的是Java是純粹的面嚮物件語言,捨棄了C語言中容易引起錯誤的指標,並引入了垃圾回收機制,不需要手動釋放記憶體。
相對於C/C
而言,Java更加簡單易用、安全 ,開發效率更高,但是執行效率略低。而且基於JVM實現了一次編譯,到處執行。也支援大型分散式應用開發、高併發(原生支援多執行緒)、高可用、高效能等應用場景。

Java是體系結構中立的,所謂的體系結構中立有兩層含義,其一是JVM的實現只要是遵守JVM規範的實現都可以,其二是JVM除了識別java編譯器編譯生成的位元組碼以外還可以識別scala,kotlin等語言編譯生成的位元組碼檔案。

Java技術體系平臺

Java自從1998年之後將Java分為三個版本,分別是JavaSE,JavaEE和JavaME,不同的版本有不同的應用場景。

  • JavaSE(Java Standard Edition):標準版Java,提供了完整的Java核心API,主要用於桌面應用開發,不過目前桌面開發基本都基於C++實現。

  • JavaEE(Java Enterprise Edition):企業式Java,主要用於企業級後臺服務,大型分散式網際網路應用開發。例如淘寶、天貓、順豐、菜鳥等等超大型網站後臺都是基於Java構建的。

  • JavaME(Java Micro Edition):嵌入式Java,主要用於開發嵌入式裝置的產品,例如塞班手機遊戲(已經消亡)。

Java9嘗試把JavaSE,JavaME,JavaEE合併起來,用模組的方式進行區分

由於目前Java主要的擅長領域是企業級後臺服務開發、Android移動應用開發以及大資料應用開發,而Java語言是它們的基石語言,因此無論是從事企業級後臺服務開發,還是Android以及大資料應用開發,都要先從JavaSE入門,然後再學習企業級應用以及大型分散式網際網路應用相關的Java技術棧,例如MyBatis,Spring Framework/Spring Boot/Spring Cloud, Spring Cloud Alibaba等等。

Java語言的跨平臺原理

平臺指的是作業系統,目前主流的桌面作業系統是Windows,macOS,Ubuntu Desktop,通常使用桌面作業系統作為開發環境。
而伺服器作業系統通常是CentOS7.x,CentOS8.x,Ubuntu Server 18.04。通常在Windows開發的Java程式需要部署到伺服器作業系統上提供後臺服務。

Java跨平臺指的是在Windows上開發的程式不需要進行任何修改,就可以部署在任意安裝了JRE(Java Runtime Enviroment)的伺服器作業系統上執行。
Java跨平臺的原理就是Java程式是執行在JRE之上,而JRE遮蔽底層作業系統的差異性,從而實現了跨平臺。雖然Java語言是跨平臺的,但是JRE是不跨平臺的。

生活中有一個典型的場景:例如一箇中國人想要和美國人、德國人、法國人交流,但是中國人不懂英語、德語和法語,此時中國人可以分別找英語翻譯、德語翻譯和法語翻譯來實現和美國人、德國人和法國人的交流。而Java程式想要在不同的作業系統上執行,也可以找不同平臺的翻譯,這個翻譯就是指的JVM(Java Virtual Machine)。

Java開發環境搭建

JRE

JRE(Java Runtime Environment)指的是Java執行時環境,包含JVM(Java Virtual Machine)以及Java核心類庫,類就是等同於Java檔案,類庫表示存放多個Java檔案的倉庫,核心類庫就是Java開發好的核心程式碼倉庫。開發者在編寫程式碼的過程中,需要使用到Java提供相關的核心類庫就放在JRE中。

JDK

JDK(Java Development Kit)是Java語言的軟體開發工具包,包含了程式碼的編譯工具(javac)和執行工具(javac)以及一些其他常用的開發工具(例如jvisualvm,jconsole等等)。編譯和執行Java程式都需要JDK提供的javac和java程式。

Java程式開發的三個步驟

開發Java程式需要三個步驟:編寫程式碼,編譯程式碼,執行程式碼。

  • 編寫程式碼:就是建立.java結尾的原始檔(例如HelloWorld.java),原始檔中編寫符合Java語言規範的Java程式碼。
  • 編譯程式碼:由於.java字尾的原始檔是JVM無法識別和執行的,需要將其翻譯為JVM識別和執行的二進位制位元組碼(byte code),實現方案就是JDK提供的javac工具,編譯時會檢查語法錯誤,如果編譯成功,會自動生成一個對應的HelloWorld.class位元組碼檔案,該檔案可以直接被JVM解釋執行
  • 執行程式碼:使用JDK提供的執行工具(java)執行編譯生成的位元組碼檔案

JDK發展史

  • 1995年SUN公司推出了Java語言
  • 1996年SUN公司釋出了JDK1.0
  • 1997年SUN公司釋出了JDK1.1
  • 1998年SUN公司釋出了JDK1.2
  • 1999年6月SUN公司將Java分成J2SE,J2ME,J2EE三個版本
  • 2000年SUN公司釋出了JDK1.3
  • 2002年SUN公司釋出了JDK1.4
  • 2004年SUN公司釋出了JDK1.5(JDK5.0),J2SE,J2ME,J2EE對應改名為JavaSE,JavaME,JavaEE
  • 2006年SUN公司釋出了JDK6.0
  • 2009年Oracle公司收購了SUN公司,至此Java和MySQL,Solaris屬於Oracle
  • 2011年Oracle公司釋出了JDK7.0
  • 2014年Oracle公司釋出了JDK8.0
  • 2017年9月Oracle公司釋出了JDK9.0
  • 2018年3月Oracle公司釋出了JDK10.0
  • 2018年9月Oracle公司釋出了JDK11.0
  • 2019年3月Oracle公司釋出了JDK12.0
  • 2019年9月Oracle公司釋出了JDK13.0
  • 2020年3月Oracle公司釋出了JDK14.0
  • 2020年9月Oracle公司釋出了JDK15.0

JDK重要版本說明:
JDK5.0是JDK發展史上具有里程碑意義的版本,具有許多新特性,例如可變引數、自動拆裝箱,泛型、註解等等,JDK1.5等同於JDK5.0,至此許多簡化企業級開發的框架也如雨後春筍般發展和壯大起來。
JDK7.0是Oracle公司09年收購SUN公司之後釋出的第一個版本,也就意味著JDK7以後下載JDK需要去Oracle官網下載。
JDK8.0是目前網際網路公司生產環境的主流JDK版本,也是Oracle公司長期支援的版本。許多Java的開源框架(例如SpringBoot2.x,Spring Cloud)都是基於該版本開發。
JDK9.0以後每半年會發佈一個新版本,但是JDK9.0,JDK10.0,JDK12.0,JDK13.0,JDK14.0,JDK15.0都不是Oracle長期支援的版本。
目前(2020/12/07)只有JDK8.0和JDK11.0是Oracle官方長期支援的版本,分別支援到2025年和2026年。

同學們在公司開發專案時選擇JDK版本,應該和公司專案的生產環境保持一致。

JDK下載

JDK包含了JRE和開發工具,因此單獨安裝JDK即可。

下載地址:https://www.oracle.com/java/technologies/javase-downloads.html
下載前需要註冊並登陸Oracle賬號,根據作業系統下載對應版本的JDK,然後同意許可協議。

  • Windows作業系統下載jdk-11.0.9_windows-x64_bin.exe
  • macOS應該選擇jdk-11.0.9_osx-x64_bin.dmg

JDK安裝

下載完JDK後就可以安裝JDK,安裝過程中只需要設定安裝路徑,需要注意的是路徑不要包含中文和空格(例如C:\Program Files\Java\jdk-11.0.9)即可。

JDK安裝目錄

  • bin目錄存放了JDK的各種工具命令,例如javac,java,jvisualvm,jconsole等等
  • conf目錄存放了JDK的相關配置檔案
  • include目錄存放了一些特定平臺的標頭檔案
  • jmods目錄存放了JDK的各種模組
  • legal目錄存放了JDK各個模組的授權文件
  • lib目錄存放了JDK工具的補充jar包

Path環境變數的配置

在開發完Java程式後,需要在Windows終端上切換到JDK的bin目錄使用javac和java命令來編譯和執行程式。
為了能夠在Windows終端上的任意路徑使用javac和java命令,可以通過PATH環境變數來實現。

首先使用快捷鍵Windows+E開啟資源管理器,然後找到此電腦

然後右鍵屬性

然後找到高階系統設定->高階->環境變數

環境變數分為使用者變數和系統變數,推薦在系統變數中配置JDK。

首先在系統變數中新建JAVA_HOME變數,指向JDK的安裝路徑C:\Program Files\Java\jdk-11.0.9

然後找到PATH環境變數,並新增%JAVA_HOME\bin%的配置,建議該配置移到頂部,配置完成後點選確定關閉所有的視窗。

然後重新輸入開啟終端,在終端的任意路徑下輸入javac -version 和java -version 檢視編譯器和直譯器的版本資訊,如果沒有提示 不是內部或者外部命令,也不是可以執行的程式,並且能夠成功輸出javac和java的版本資訊就表示PATH環境變數配置成功。

當在終端上輸入javac或者Java命令時,系統會首先從當前路徑下查詢javac或者java命令對應的可執行程式(即javac.exe或者java.exe)並執行,如果找到不到會從PATH環境變數配置中查詢,PATH環境變數找不到則會提示不是內部或者外部命令,也不是可以執行的程式。

而如果電腦上安裝了其他版本的JDK,例如JDK15時,只需要將JAVA_HOME的路徑修改成JDK15的目錄即可。

常見的Windows命令

早期的程式都是基於字元介面的終端上執行的

學習和使用Windows命令的目的就是為了能在Windows終端上使用javac.exe和java.exe工具

因為JDK提供的javac.exe和java.exe和普通的Windows可執行程式不同,不是通過雙擊執行去使用,而是需要藉助Windows終端通過指令使用。

Windows終端通過Windows+r鍵開啟執行視窗,然後開啟執行視窗輸入cmd後回車即可開啟Windows終端

Windows終端

也可以直接在Win10的搜尋欄中直接輸入cmd搜尋,然後點選命令提示符就可以開啟Windows終端

Windows終端和圖形介面使用滑鼠點選的方式不同,所有的操作都是採用命令的字元介面互動。

當在終端上輸入javac或者java命令時,終端會提示不是內部或者外部命令,也不是可以執行的程式,

因為javac位於C:\Program Files\Java\jdk-11.0.9\bin目錄下,所有系統找不到後提示不是內部或者外部命令,也不是可以執行的程式,而預設開啟終端的路徑是C:Users\ittim,其中ittim是使用者名稱,因此需要使用>cd "..\..\Program Files\Java\jdk-11.0.9\bin"切換到JDK11的bin目錄下。其中cd ..\表示切換到上一級目錄,可以使用Tab鍵用於補全路徑,切換到JDK的bin目錄以後就可以使用javac和java命令。
當在終端上輸入javac或者java命令時預設展示的是javac和java命令選項和說明。

還有一種更加簡潔的方式開啟終端時就定位指定的目錄。
首先開啟指定的目錄(例如C:\Program Files\Java\jdk-11.0.9\bin),然後在位址列輸入cmd後回車就可以開啟終端

並且終端此時的路徑就是JDK的bin目錄

除了cd命令以外,Windows終端上還有一些日常工作中常使用的命令

  • cd \ 切換到碟符的根目錄,cd命令只能在當前碟符下切換,而如果想要切換到D盤,E盤,直接輸入D:或者E:然後回車即可
  • dir 檢視目錄檔案列表
  • ipconfig 檢視ip
  • ping +ip 檢測網路是否通常
  • telnet ip port 檢查 某個機器的埠是否可以訪問
  • firewall.cpl 檢視Windows防火牆
  • explore 檔案資源管理器
  • cls 清屏
  • exit 退出Windows終端

HelloWorld程式開發

HelloWorld程式開發和執行

HelloWorld程式是學習一門程式語言的入門程式,當能夠獨立開發並執行HelloWorld時,就證明可以邁向這門程式語言的大門了。
這裡我們首先使用最原始的文字編輯器工具記事本來編寫HelloWorld程式。

  1. 在D盤的根目錄下滑鼠右鍵選擇新建文字文件,並修改檔名為HelloWorld.java,其中HelloWorld表示檔名,而.java表示字尾名,Java規定Java原始檔必須是.java結尾。
  2. 然後編寫HelloWorld程式,編寫完成後使用Ctrl+s儲存檔案
public class HelloWorld{

	public static void main(String[]args){
		System.out.println("Hello World with Window10 1903& JDK11.0.9 & Notepad");
	}
}


Hello World

  1. 在終端上使用javac HelloWorld.java 編譯原始檔,編譯時會檢查語法錯誤,如果程式沒有問題會編譯生成HelloWorld.class
  2. 在終端上使用java HelloWorld來執行Java程式,程式會出輸出Hello World with Window10 1903& JDK11.0.9 & Notepad 並換行。


編譯和執行

HelloWorld程式詳解

  • public 是一個類的許可權修飾符,這裡需要注意如果使用了public修飾的類,那麼類名和檔名必須一致。
  • class 用於定義一個類,類是Java程式的最小單元,類中可以包含屬性和方法,一個原始檔中可以定義多個class,但是隻能有一個是public修飾。
  • public static void main(String[]args){} 表示定義一個靜態、不帶返回值的main方法,該方法是Java程式的入口方法,當使用java HelloWorld 執行程式是從main方法開始執行。如果程式想要執行必須要定義固定格式的main方法,不然Java程式是沒法獨立執行的。
  • System.out.println("Hello World with Window10 1903& JDK11.0.9 & Notepad");表示向終端列印輸出Hello World with Window10 1903& JDK11.0.9 & Notepad並換行。System.out.println("")表示列印輸出指定的內容並換行,想要列印輸出其他的內容,改變雙引號""中內容的即可。需要注意的是Java中的每條可執行語句需要使用;結束

HelloWorld程式常見問題

HelloWorld程式雖然簡單,但是如果你是一個初學者,可能會遇到許多常見的問題(俗稱Bug)。
如果程式有問題,Java程式會給出提示,需要開發者理解Java程式給出的提示資訊,然後提供解決方案, 不斷解決Bug才能提高自身的工作效率。

常見問題1:大小寫問題


找不到符號

Windows不區分大小寫,Java是嚴格區分大小寫,例如這裡的string和String是完全不同的含義。因此使用javac編譯時編譯器會提示找不到符號,即不知道string是什麼意思。

常見問題2: 非法字元


非法字元

Java程式的符號(例如這裡的分號)都是英文狀態下輸入的,不能使用中文符號。

錯誤3:如果System.out.println()語句中的內容是中文在Windows終端上編譯並執行執行時可能有亂碼

public class HelloWorld{
    public static void main(String[] args) {
        System.out.println("我的第一個Java程式");
    }
}


HelloWorld原始碼
因為Windows的終端預設是GBK的編碼,而HelloWorld.java原始檔可能是UTF-8,此時原始檔名的編碼和Windows的編碼不一致,從而出現了亂碼。

解決方法:調整HelloWorld.java原始檔的編碼為GBK後,再次編譯並執行HelloWorld.java

使用Visual Studio Code開啟HelloWorld.java, 點選右下角的UTF-8,然後選擇通過編碼儲存,並選擇GBK編碼

編譯並執行修改編碼後的程式

除此以外還可以使用javac -encoding utf-8 HelloWorld.java來指定終端上使用UTF-8來編譯Java原始檔

Visual Studio Code開發Java程式

Visual Studio Code的下載和安裝

作業系統自帶的文字編輯器(例如Windows的記事本)功能比較單一,例如不能顯示行號,關鍵字沒有顏色區分等等,也沒有程式碼補全,不支援安裝外掛,不方便排查程式的錯誤,開發程式效率比較低下。

Visual Studio Code是微軟推出的一款開源、跨平臺(Windows,Ubuntu,macOS)、功能強大的文字編輯器,這裡使用它來編寫Java語言的原始碼,當然除了編寫Java程式碼之外,還可以用來編寫C/C++,Python,Go,JavaScript,PHP程式等等,也支援外掛來擴充套件功能。如果你是Java的初學者,我這裡建議首先使用Visual Studio Code來編寫Java程式。

在使用Visual Studio Code之前你需要去官網下載最新的可用版本,Visual Studio Code是跨平臺的,當使用瀏覽器訪問官網時,會自動檢測作業系統的版本,然後顯示對應作業系統版本的Visual Stuido Code。

當下載完成後會得到一個VSCodeUserSetup-x64-1.51.1.exe安裝程式,只需要點選安裝安裝程式,同意許可協議便可以安裝Visual Studio Code。

使用Visual Studio Code編寫Java程式

首先在系統的磁碟上建立一個目錄D:\workspace\java\java-core用於儲存Java程式碼

然後在Windows10的搜尋欄中搜索Visual Studio Code並啟動

啟動後切換到資源管理器檢視,開啟剛才建立的java-core資料夾


Open Folder


java-core


vscode-java-core

然後建立檔案HelloWorld.java

並編寫HelloWorld

public class HelloWorld{
    public static void main(String[]args){
        System.out.println("Hello World with Windows10 1903 & JDK11.09 & Visual Studio Code ");
    }
}

根據Visual Studio Code中編寫的HelloWorld最直接的對比記事本編寫的HelloWorld而言,Visual Studio Code中的HelloWorld有行號和字型顏色


HelloWorld.java

在終端上編譯並執行HelloWorld

使用Java Extension Pack外掛開發Java程式

Java Extension Pack安裝

由於每次編寫完Java原始檔後,都需要啟動Windows終端來編譯和執行Java程式,這樣效率比較低,我們可以使用Visual Stuido Code提供的Java外掛來實現建立java-core-jdk專案,編寫程式碼後直接在Visual Studio Code中編譯、除錯和執行Java程式。

首先在Visual Studio Code的外掛商店(Control+Shift+x)中搜索Java,然後找到Java Extension Pack點選安裝即可,該外掛預設集成了6大外掛

  • Visual Studio IntelliCode
  • Maven for Java
  • Language for Java
  • Java Test Runner
  • Debugger for Java
  • Project Manager for Java


安裝外掛

建立java-core-jdk專案

安裝完成後使用快捷鍵Control+Shift+P 然後輸入Create Java Project來建立Java專案

不選擇構建工具

選擇專案的路徑為D:\workspace\java\ittimelinedotnet

輸入專案的名字java-core-jdk並回車

Visual Studio Code會自動建立一個普通的Java專案java-core-jdk
其中src目錄用於存放java原始碼,而lib用於存放第三方依賴的類庫,App類用於測試編譯和執行環境。

在自動生成的App類中可以點選Run執行

在Visual Studio Code中內建的終端可以檢視程式執行結果

當多次執行App.java時可以通過Visual Studio Code的終端得知預設使用的JDK11來編譯和執行Java程式

建立包管理原始碼

為了方便後期的程式碼管理,這裡在src目錄下建立一個名為net.ittimeline.java.core.jdk.foundational.object的包

所有Java語言基礎的內容都會存放在net.ittimeline.java.core.jdk包內,Java的包等同於資料夾

當在net.ittimeline.java.core.jdk.foundational.object包下建立HelloWorld.java原始檔時

會自動生成如下模板,因為Java語言規定Java原始檔所在的目錄和包名相同

package net.ittimeline.java.core.jdk.foundational.object;

public class HelloWorld {
    
}

package關鍵字用於宣告一個包,package net.ittimeline.java.core.jdk.foundational.object; 是一條包宣告語句,必須放在原始檔的第一行,用於描述原始檔HelloWorld.java所在的資料夾目錄。此時使用Visual Studio Code的Java外掛實現執行Hello World程式


HelloWorld.java
然後在HelloWorld類中輸入main就可以快速生成main方法,輸入sysout也可以生成System.out.println();語句


程式執行結果

package net.ittimeline.java.core.jdk.foundational.object;

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World with Windows10 1903 & JDK11.0.9 &Visual Studio Code");
    }
}

想要了解Visual Studio Code Java外掛的更多功能,可以閱讀官網提供的Java文件。

Visual Studio Code 關於Java的使用文件:https://code.visualstudio.com/docs/java/java-tutorial