日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Springboo零配置原理

發(fā)布時間:2024/10/5 javascript 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Springboo零配置原理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、一個web程序怎么跑起來?

當(dāng)客戶端(可以是瀏覽器、也可以是postman等工具)發(fā)送請求給服務(wù)器后,服務(wù)器會調(diào)用并執(zhí)行對應(yīng)的邏輯代碼進(jìn)行請求處理。邏輯代碼是由程序員自己編寫然后放進(jìn)服務(wù)器進(jìn)行運(yùn)行,然后講運(yùn)行后的結(jié)果返回給客戶端。

而他們之間的交互規(guī)則一般是由http協(xié)議來實(shí)現(xiàn)的:

當(dāng)然為為了在網(wǎng)絡(luò)中找到后端服務(wù)器需要執(zhí)行的代碼需要做些什么呢?

1、在網(wǎng)絡(luò)中找到后端服務(wù)器:而這個過程依賴于DNS服務(wù),而DNS服務(wù)是互聯(lián)網(wǎng)的核心

DNS是域名系統(tǒng)(Domain Name System)的縮寫,是一種組織域?qū)哟谓Y(jié)構(gòu)的計(jì)算機(jī)和網(wǎng)絡(luò)服務(wù)命名系統(tǒng)。當(dāng)用戶在應(yīng)用程序中輸入DNS名稱時,DNS服務(wù)可以將此名稱解析為與此名稱相關(guān)的IP地址信息。用戶在使用網(wǎng)絡(luò)服務(wù)時喜歡在瀏覽器的地址欄中輸入使用主機(jī)名和域名組成的名稱,如computer.myblog.com,因?yàn)檫@樣的名稱更容易被用戶記住。但是,計(jì)算機(jī)在網(wǎng)絡(luò)上是使用IP地址來通信的。為了能夠?qū)崿F(xiàn)網(wǎng)絡(luò)計(jì)算機(jī)之間通信,DNS服務(wù)器所提供的服務(wù)就是將用戶所使用的計(jì)算機(jī)或服務(wù)名稱映射為IP地址。

2、servlet原理和tomcat原理

那么如何告訴這臺服務(wù)器我想執(zhí)行哪里的java代碼?

在本地我們直接運(yùn)行main方法即可啟動程序執(zhí)行java代碼,但是在web應(yīng)用中我們不可能每次來個請求,我都去點(diǎn)一下main方法去執(zhí)行相應(yīng)的代碼。

所以需要些一個寫一個根據(jù)用戶請求來調(diào)用相應(yīng)邏輯代碼的容器(對象),執(zhí)行完相應(yīng)邏輯后,java主線程并沒有結(jié)束,而是在那里等待用戶請求。這個容器就叫做服務(wù)器,每個請求的過程就是把程序員自己些的代碼放入這個服務(wù)器執(zhí)行并相應(yīng)的過程。可是這個容器要能跑java代碼的話,那也就必須要按照jvm規(guī)范去實(shí)現(xiàn)。那么服務(wù)器又如何知道去應(yīng)該調(diào)用那個類和哪個方法來處呢?也就是服務(wù)器怎么才能認(rèn)識程序員執(zhí)行的代碼。由于java的多態(tài)的性質(zhì),程序員寫的代碼只要和服務(wù)器共同實(shí)現(xiàn)一個接口,

只要將程序員寫的這個對象傳入服務(wù)器,就可以直接執(zhí)行這個代碼。而這個技術(shù)就叫Servlet,只要程序員都請求都去實(shí)現(xiàn)servlet接口,請求的時候傳給服務(wù)器容器,就去找這個實(shí)例對象中的一個service方法,去執(zhí)行。而tomcat服務(wù)器就是一種這樣的服務(wù)器實(shí)現(xiàn)。

?

當(dāng)瀏覽器發(fā)送請求給服務(wù)器后,服務(wù)器會調(diào)用并執(zhí)行對應(yīng)的邏輯代碼進(jìn)行請求處理。邏輯代碼是由程序員自己編寫然后放進(jìn)服務(wù)器進(jìn)行運(yùn)行,其實(shí)就是 Servlet程序。狹義的 Servlet 是指 Java 語言實(shí)現(xiàn)的一個接口;廣義的 Servlet 是指任何實(shí)現(xiàn)了這個 Servlet 接口的類,一般情況下,人們將 Servlet 理解為后者。Servlet 運(yùn)行于支持 Java 的應(yīng)用服務(wù)器中。從原理上講,Servlet 可以響應(yīng)任何類型的請求,但絕大多數(shù)情況下 Servlet 只用來擴(kuò)展基于 HTTP 協(xié)議的 Web 服務(wù)器。

servlet的使用:

3、為什么springboot可以使用jar包直接部署?

在剛進(jìn)公司的時候,我很疑惑為什么程序直接個jar包就直接扔到docker容器上運(yùn)行了,容器上好像也沒有tomcat服務(wù)器。

因?yàn)閣eb項(xiàng)目不是應(yīng)該打war包后,再放入tomcat容器中運(yùn)行嗎?這不符合常識。

讓我們看看網(wǎng)上是怎么說的?

war是一個web模塊,其中需要包括WEB-INF,是可以直接運(yùn)行的WEB模塊。而jar一般只是包括一些class文件,在聲明了Main_class之后是可以用java命令運(yùn)行的.
它們都是壓縮的包,拿Tomcat來說,將war文件包放置它的\webapps\目錄下,啟動Tomcat,這個包可以自動進(jìn)行解壓,也就是你的web目錄,相當(dāng)于發(fā)布了。
war包:是做好一個web應(yīng)用后,通常是網(wǎng)站,打成包部署到容器中。
jar包:通常是開發(fā)時要引用通用類,打成包便于存放管理。
ear包:企業(yè)級應(yīng)用,通常是EJB打成ear包。
所有的包都是用jar打的,只不過目標(biāo)文件的擴(kuò)展名不一樣。
WAR是Sun提出的一種Web應(yīng)用程序格式,與JAR類似,也是許多文件的一個壓縮包。這個包中的文件按一定目錄結(jié)構(gòu)來組織:通常其根目錄下包含有Html和Jsp文件或者包含這兩種文件的目錄,另外還會有一個WEB-INF目錄,這個目錄很重要。通常在WEB-INF目錄下有一個web.xml文件和一個classes目錄,web.xml是這個應(yīng)用的配置文件,而classes目錄下則包含編譯好的Servlet類和Jsp或Servlet所依賴的其它類(如JavaBean)。通常這些所依賴的類也可以打包成JAR放到WEB-INF下的lib目錄下,當(dāng)然也可以放到系統(tǒng)的CLASSPATH中,但那樣移植和管理起來不方便。

那我們明白了jar包是可以直接運(yùn)行的,而war包得借助于tomcat容器才可以運(yùn)行。

好了springboot干了件什么事情呢?

內(nèi)置了tomcat容器。tomcat容器說白了也就是個.exe文件,我直接放在我代碼中去啟動可以嗎?當(dāng)然可以。

4、springboot為什么可以零配置?

 分析SpringBoot如何省去web.xml還得從Servlet3.0的規(guī)范說起:

ServletContainerInitializer類通過jar services API查找。對于每一個應(yīng)用,應(yīng)用啟動時,由容器創(chuàng)建一個ServletContainerInitializer 實(shí)例。 框架提供的ServletContainerInitializer實(shí)現(xiàn)必須綁定在 jar 包 的META-INF/services 目錄中的一個叫做 javax.servlet.ServletContainerInitializer 的文件,根據(jù) jar services API,指定 ServletContainerInitializer 的實(shí)現(xiàn)。除 ServletContainerInitializer 外,我們還有一個注解@HandlesTypes。在 ServletContainerInitializer 實(shí)現(xiàn)上的@HandlesTypes注解用于表示感興趣的一些類,它們可能指定了 HandlesTypes 的 value 中的注解(類型、方法或自動級別的注解),或者是其類型的超類繼承/實(shí)現(xiàn)了這些類之一。無論是否設(shè)置了 metadata-complete,@HandlesTypes 注解將應(yīng)用。當(dāng)檢測一個應(yīng)用的類看是否它們匹配 ServletContainerInitializer 的 HandlesTypes 指定的條件時,如果應(yīng)用的一個或多個可選的 JAR 包缺失,容器可能遇到類裝載問題。由于容器不能決定是否這些類型的類裝載失敗將阻止應(yīng)用正常工作,它必須忽略它們,同時也提供一個將記錄它們的配置選項(xiàng)。如果ServletContainerInitializer 實(shí)現(xiàn)沒有@HandlesTypes 注解,或如果沒有匹配任何指定的@HandlesType,那么它會為每個應(yīng)用使用 null 值的集合調(diào)用一次。這將允許 initializer 基于應(yīng)用中可用的資源決定是否需要初始化 Servlet/Filter。在任何 Servlet Listener 的事件被觸發(fā)之前,當(dāng)應(yīng)用正在啟動時,ServletContainerInitializer 的 onStartup 方法將被調(diào)用。ServletContainerInitializer’s 的onStartup 得到一個類的 Set,其或者繼承/實(shí)現(xiàn) initializer 表示感興趣的類,或者它是使用指定在@HandlesTypes 注解中的任意類注解的。

 這個規(guī)范如何理解呢?

  簡單來說,當(dāng)實(shí)現(xiàn)了Servlet3.0規(guī)范的容器(比如tomcat7及以上版本)啟動時,通過SPI擴(kuò)展機(jī)制自動掃描所有已添加的jar包下的META-INF/services/javax.servlet.ServletContainerInitializer中指定的全路徑的類,并實(shí)例化該類,然后回調(diào)META-INF/services/javax.servlet.ServletContainerInitializer文件中指定的ServletContainerInitializer的實(shí)現(xiàn)類的onStartup方法。?如果該類存在@HandlesTypes注解,并且在@HandlesTypes注解中指定了我們感興趣的類,所有實(shí)現(xiàn)了這個類的onStartup方法將會被調(diào)用。

  再直白一點(diǎn)來說,存在web.xml的時候,Servlet容器會根據(jù)web.xml中的配置初始化我們的jar包(也可以說web.xml是我們的jar包和Servlet聯(lián)系的中介)。而在Servlet3.0容器初始化時會調(diào)用jar包META-INF/services/javax.servlet.ServletContainerInitializer中指定的類的實(shí)現(xiàn)(javax.servlet.ServletContainerInitializer中的實(shí)現(xiàn)替代了web.xml的作用,而所謂的在@HandlesTypes注解中指定的感興趣的類,可以理解為具體實(shí)現(xiàn)了web.xml的功能,當(dāng)然也可以有其他的用途)。

具體可參考此文: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

未完待續(xù)。。。

?

?

總結(jié)

以上是生活随笔為你收集整理的Springboo零配置原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。