不引戰,不撕逼,就是學習的分享,若是對中間我的夾帶的一些私貨不屑一顧,笑笑就行了。水平有限,有不正確的地方請你們指正。
最近疫情在家,就想着研究一下spring。我是第一次學習JAVA,固然也是第一次學習spring框架,我的認爲先把helloworld項目跑起來,創建起信心,這樣纔有利於接下來的學習。因此我會力求把小細節說清楚,省得和我同樣的新手,尚未開始學習JAVA和spring,先放棄安裝環境了。先裝JDK和IDE,這個就是下一步下一步的事情,IDE你們隨意,我用的是eclipse,spring官方推薦的JDK版本是OPENJDK8和11。php
先跑個helloworld。整個過程很是簡單,去官方一個spring初始化網站去填寫一些包信息,再添加依賴,就能夠生成一個壓縮文件,解壓到你喜歡的目錄下面。
html
而後切換到這個目錄下,運行./mvnw spring-boot:run
,首先這個程序會先下載指定版本的maven,而後再經過maven下載依賴。下載maven的過程還算順利,但maven下載依賴的速度太感人了,只能換個源。筆者的系統是windows,因此在用戶目錄/.m2/wrapper/dists/apache-maven-version-bin/一串哈希/apache-maven-version/conf/settings.xml
文件中的mirrors標籤新增一項mirror。java
<mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>
再切換到spring目錄下面運行./mvnw spring-boot:run
,舒服了。想要看到頁面,還得加一步,下載下來的包沒有路由,和對應的控制器,要稍微加工一下。react
打開IDE,導入項目,eclipse會自動更新依賴,可是eclipse用的maven是默認自帶的maven,默認的maven下載依賴速度太慢,因此要配置成剛纔咱們設置爲阿里源的maven。
web
而後強制下載依賴,alt+f5,勾選強行更新
spring
等待maven下載依賴,而後將如下代碼複製到DemoApplication.javaapache
package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @GetMapping("/hello") public String hello(@RequestParam(value = "name", defaultValue = "World") String name) { return String.format("Hello %s!", name); } }
從新運行./mvnw spring-boot:run
,輸入http://localhost:8080/hello
,成功看到頁面。
windows
到這裏,最重要的步驟實際上是配置maven和IDE,只要配置好maven的下載鏡像和正確配置好IDE,整個項目就能跑起來,不少人會由於下載速度過慢就已經放棄了,也不用談接下來的學習tomcat
到這裏尚未結束,趁熱打鐵,趁着項目跑起來創建的信心,看一波DemoApplication.java的代碼,有個大概。服務器
package對應php中的namespace,就是個命名空間。import就是use的別名。由於是強類型語言,函數和參數多了類型。首字母大寫駝峯式看來是JAVA的類命名習慣,方法名看來是首字母小寫駝峯式,方法的花括號看來是和方法名或類名同一行。多了一些註解,這個PHP沒有原生支持的語法,有用註釋實現的doctrine annotations。這麼看來,這個包的想法也是來源於java,命名上也是像素級拷貝。doctrine annotations我也沒有研究過,只是知道有這個東西,如今也不用去研究PHP這個包,系統地學習JAVA的註解就能夠了。
這樣,也爲下一步的學習明確了方向。邊學習spring,邊學習JAVA,雖然不算科學,但應該是相對有意思的一種學習方法了。
尚未完,再看一看spring的運行方式,PHP的典型的運行方式是FASTCGI,通常前面有個NGINX服務器,轉發給PHP-FPM,PHP處理完成以後,把結果發給NGINX,NGINX發給客戶端,PHP釋放資源,包括與MYSQL服務器的鏈接,與REDIS服務器的鏈接等等。下一次,新請求來了,PHP再與MYSQL和REDIS創建鏈接,而後處理完成以後又釋放掉這些資源,如此往復。但這樣的工做方式明顯低效,由於TCP三次握手和四次揮手,都是耗時的工做,增長了單次請求的響應時間,下降了系統的併發量。Swoole擴展的出世,常駐內存,不用每次處理完請求就釋放資源,複用鏈接大量節省時間和資源,必定程度上解決了這個問題。但本文並不討論swoole,只是用PHPER的方式去看spring,試圖分析一下spring是怎麼運行,怎麼樣服務客戶端。
我去翻了翻在終端運行起來的spring服務,發現了一些端倪,spring彷佛內嵌了一個tomcat,並偵聽8080端口。去搜索引擎搜一下"spring 內嵌tomcat",瞭解了一下相關的信息,果真如我猜想的同樣,spring內嵌了一個tomcat,用於方便開發者的開發階段。tomcat能夠做爲一個jar包讓JAVA進行調用,這真是方便。PHP目前也只有Swoole提供了httpServer開發接口,另外PHP實現的workerman和reactphp也提供了httpServer,我的更喜歡用reactphp,設計得很好,模塊化,按需引入。
本章節就先到這裏,有一些PHPER的視角和感想,你們見笑。