javascript
Springboo零配置原理
1、一個web程序怎么跑起來?
當客戶端(可以是瀏覽器、也可以是postman等工具)發送請求給服務器后,服務器會調用并執行對應的邏輯代碼進行請求處理。邏輯代碼是由程序員自己編寫然后放進服務器進行運行,然后講運行后的結果返回給客戶端。
而他們之間的交互規則一般是由http協議來實現的:
當然為為了在網絡中找到后端服務器需要執行的代碼需要做些什么呢?
1、在網絡中找到后端服務器:而這個過程依賴于DNS服務,而DNS服務是互聯網的核心
DNS是域名系統(Domain Name System)的縮寫,是一種組織域層次結構的計算機和網絡服務命名系統。當用戶在應用程序中輸入DNS名稱時,DNS服務可以將此名稱解析為與此名稱相關的IP地址信息。用戶在使用網絡服務時喜歡在瀏覽器的地址欄中輸入使用主機名和域名組成的名稱,如computer.myblog.com,因為這樣的名稱更容易被用戶記住。但是,計算機在網絡上是使用IP地址來通信的。為了能夠實現網絡計算機之間通信,DNS服務器所提供的服務就是將用戶所使用的計算機或服務名稱映射為IP地址。
2、servlet原理和tomcat原理
那么如何告訴這臺服務器我想執行哪里的java代碼?
在本地我們直接運行main方法即可啟動程序執行java代碼,但是在web應用中我們不可能每次來個請求,我都去點一下main方法去執行相應的代碼。
所以需要些一個寫一個根據用戶請求來調用相應邏輯代碼的容器(對象),執行完相應邏輯后,java主線程并沒有結束,而是在那里等待用戶請求。這個容器就叫做服務器,每個請求的過程就是把程序員自己些的代碼放入這個服務器執行并相應的過程。可是這個容器要能跑java代碼的話,那也就必須要按照jvm規范去實現。那么服務器又如何知道去應該調用那個類和哪個方法來處呢?也就是服務器怎么才能認識程序員執行的代碼。由于java的多態的性質,程序員寫的代碼只要和服務器共同實現一個接口,
只要將程序員寫的這個對象傳入服務器,就可以直接執行這個代碼。而這個技術就叫Servlet,只要程序員都請求都去實現servlet接口,請求的時候傳給服務器容器,就去找這個實例對象中的一個service方法,去執行。而tomcat服務器就是一種這樣的服務器實現。
?
當瀏覽器發送請求給服務器后,服務器會調用并執行對應的邏輯代碼進行請求處理。邏輯代碼是由程序員自己編寫然后放進服務器進行運行,其實就是 Servlet程序。狹義的 Servlet 是指 Java 語言實現的一個接口;廣義的 Servlet 是指任何實現了這個 Servlet 接口的類,一般情況下,人們將 Servlet 理解為后者。Servlet 運行于支持 Java 的應用服務器中。從原理上講,Servlet 可以響應任何類型的請求,但絕大多數情況下 Servlet 只用來擴展基于 HTTP 協議的 Web 服務器。
servlet的使用:
3、為什么springboot可以使用jar包直接部署?
在剛進公司的時候,我很疑惑為什么程序直接個jar包就直接扔到docker容器上運行了,容器上好像也沒有tomcat服務器。
因為web項目不是應該打war包后,再放入tomcat容器中運行嗎?這不符合常識。
讓我們看看網上是怎么說的?
war是一個web模塊,其中需要包括WEB-INF,是可以直接運行的WEB模塊。而jar一般只是包括一些class文件,在聲明了Main_class之后是可以用java命令運行的.
它們都是壓縮的包,拿Tomcat來說,將war文件包放置它的\webapps\目錄下,啟動Tomcat,這個包可以自動進行解壓,也就是你的web目錄,相當于發布了。
war包:是做好一個web應用后,通常是網站,打成包部署到容器中。
jar包:通常是開發時要引用通用類,打成包便于存放管理。
ear包:企業級應用,通常是EJB打成ear包。
所有的包都是用jar打的,只不過目標文件的擴展名不一樣。
WAR是Sun提出的一種Web應用程序格式,與JAR類似,也是許多文件的一個壓縮包。這個包中的文件按一定目錄結構來組織:通常其根目錄下包含有Html和Jsp文件或者包含這兩種文件的目錄,另外還會有一個WEB-INF目錄,這個目錄很重要。通常在WEB-INF目錄下有一個web.xml文件和一個classes目錄,web.xml是這個應用的配置文件,而classes目錄下則包含編譯好的Servlet類和Jsp或Servlet所依賴的其它類(如JavaBean)。通常這些所依賴的類也可以打包成JAR放到WEB-INF下的lib目錄下,當然也可以放到系統的CLASSPATH中,但那樣移植和管理起來不方便。
那我們明白了jar包是可以直接運行的,而war包得借助于tomcat容器才可以運行。
好了springboot干了件什么事情呢?
內置了tomcat容器。tomcat容器說白了也就是個.exe文件,我直接放在我代碼中去啟動可以嗎?當然可以。
4、springboot為什么可以零配置?
分析SpringBoot如何省去web.xml還得從Servlet3.0的規范說起:
ServletContainerInitializer類通過jar services API查找。對于每一個應用,應用啟動時,由容器創建一個ServletContainerInitializer 實例。 框架提供的ServletContainerInitializer實現必須綁定在 jar 包 的META-INF/services 目錄中的一個叫做 javax.servlet.ServletContainerInitializer 的文件,根據 jar services API,指定 ServletContainerInitializer 的實現。除 ServletContainerInitializer 外,我們還有一個注解@HandlesTypes。在 ServletContainerInitializer 實現上的@HandlesTypes注解用于表示感興趣的一些類,它們可能指定了 HandlesTypes 的 value 中的注解(類型、方法或自動級別的注解),或者是其類型的超類繼承/實現了這些類之一。無論是否設置了 metadata-complete,@HandlesTypes 注解將應用。當檢測一個應用的類看是否它們匹配 ServletContainerInitializer 的 HandlesTypes 指定的條件時,如果應用的一個或多個可選的 JAR 包缺失,容器可能遇到類裝載問題。由于容器不能決定是否這些類型的類裝載失敗將阻止應用正常工作,它必須忽略它們,同時也提供一個將記錄它們的配置選項。如果ServletContainerInitializer 實現沒有@HandlesTypes 注解,或如果沒有匹配任何指定的@HandlesType,那么它會為每個應用使用 null 值的集合調用一次。這將允許 initializer 基于應用中可用的資源決定是否需要初始化 Servlet/Filter。在任何 Servlet Listener 的事件被觸發之前,當應用正在啟動時,ServletContainerInitializer 的 onStartup 方法將被調用。ServletContainerInitializer’s 的onStartup 得到一個類的 Set,其或者繼承/實現 initializer 表示感興趣的類,或者它是使用指定在@HandlesTypes 注解中的任意類注解的。
這個規范如何理解呢?
簡單來說,當實現了Servlet3.0規范的容器(比如tomcat7及以上版本)啟動時,通過SPI擴展機制自動掃描所有已添加的jar包下的META-INF/services/javax.servlet.ServletContainerInitializer中指定的全路徑的類,并實例化該類,然后回調META-INF/services/javax.servlet.ServletContainerInitializer文件中指定的ServletContainerInitializer的實現類的onStartup方法。?如果該類存在@HandlesTypes注解,并且在@HandlesTypes注解中指定了我們感興趣的類,所有實現了這個類的onStartup方法將會被調用。
再直白一點來說,存在web.xml的時候,Servlet容器會根據web.xml中的配置初始化我們的jar包(也可以說web.xml是我們的jar包和Servlet聯系的中介)。而在Servlet3.0容器初始化時會調用jar包META-INF/services/javax.servlet.ServletContainerInitializer中指定的類的實現(javax.servlet.ServletContainerInitializer中的實現替代了web.xml的作用,而所謂的在@HandlesTypes注解中指定的感興趣的類,可以理解為具體實現了web.xml的功能,當然也可以有其他的用途)。
具體可參考此文:https://www.cnblogs.com/hello-shf/p/10926271.html
第一:web.xml
那么只要能夠自動去掃描類,初始化spring容器,自動注冊severlet就可以省掉web.xml了。
去看看這篇文章,你會理解的
https://blog.csdn.net/qq_32099833/article/details/103543970?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-1&spm=1001.2101.3001.4242
未完待續。。。
?
?
總結
以上是生活随笔為你收集整理的Springboo零配置原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网关、负载均衡、服务注册发现什么关系?
- 下一篇: Springboot本地缓存和redis