<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          SpringBoot和Spring到底有沒有本質(zhì)的不同?

          共 2966字,需瀏覽 6分鐘

           ·

          2020-01-09 23:26


          本文公眾號來源:編程新說作者:編程新說李新杰本文已收錄至我的GitHub


          現(xiàn)在的Spring相關(guān)開發(fā)都是基于SpringBoot的。

          最后在打包時可以把所有依賴的jar包都打進(jìn)去,構(gòu)成一個獨(dú)立的可執(zhí)行的jar包。如下圖:

          b8f58e2423bccfaca17a99edbbd0c287.webp


          使用java -jar命令就可以運(yùn)行這個獨(dú)立的jar包。如下圖:

          a6e00b212e630be5f9bcb4f205f60b97.webp


          這個jar包的執(zhí)行入口就是一個main函數(shù),典型的格式如下:

          @SpringBootApplication
          public?class?TasteSpringApplication?{
          ????public?static?void?main(String[]?args)?{
          ????????SpringApplication.run(TasteSpringApplication.class,?args);
          ????}
          }

          從代碼中可以得知,SpringApplication這個類就是SpringBoot的總?cè)肟凇?/span>

          以上這些內(nèi)容,早已是路人皆知的事情了,這里只是再贅述一遍。


          進(jìn)入SpringApplication這個類的源碼里,首先看到的就是幾個application context所使用的類。

          首先是AnnotationConfigApplicationContext,這是基于注解的非web應(yīng)用使用的類,它是spring-context里面的類,現(xiàn)在也用于SpringBoot中。

          這表明對于非web應(yīng)用來說,采用傳統(tǒng)的Spring構(gòu)建,或是采用現(xiàn)在的SpringBoot構(gòu)建,核心部分并沒有什么本質(zhì)區(qū)別。畢竟連類都是用的同一個。


          再看就是AnnotationConfigServletWebServerApplicationContext,這是基于注解的web應(yīng)用使用的類,注意,這個類是SpringBoot里的類。

          其實大家都知道,在還沒有SpringBoot時,基于傳統(tǒng)Spring構(gòu)建web應(yīng)用時使用的是AnnotationConfigWebApplicationContext這個類。

          這個類位于spring-web中,顯然它是Spring里面的類。(注:本文中所說的Spring指的是SpringFramework)

          這里有一個問題,不知你是否發(fā)現(xiàn),從Spring到SpringBoot,非web應(yīng)用使用的類沒有變,web應(yīng)用使用的類改變了,為啥呢?


          這個問題其實很簡單,從它們的啟動方式的差異就能很好的說明。

          傳統(tǒng)Spring構(gòu)建的web應(yīng)用,會打成一個war包,放入tomcat下面。

          先啟動tomcat,然后tomcat再去加載它下面的web應(yīng)用(即war包)。

          SpringBoot構(gòu)建的web應(yīng)用,會打成一個jar包,采用內(nèi)嵌的tomcat。

          先啟動jar包,會進(jìn)入SpringBoot中,然后再去啟動tomcat。

          因為現(xiàn)在SpringBoot要來負(fù)責(zé)啟動和停止web server,這和傳統(tǒng)Spring完全不同,所以它要自己實現(xiàn)一個web application context所使用的類。

          由此我們可以推斷出,這個類里一定有關(guān)于web server啟動和停止的相關(guān)內(nèi)容。


          再來觀察一個細(xì)節(jié),沒錯,就是類名稱。

          傳統(tǒng)Spring使用的類名稱可以提煉出一個關(guān)鍵詞,就是Web。SpringBoot使用的類名稱可以提煉出的關(guān)鍵詞是ServletWebServer

          前者只有Web,說明只關(guān)注web的問題,后者除了Web外還有Server,說明除了關(guān)注web外還要關(guān)注服務(wù)器,即tomcat、jetty等這些web服務(wù)器。

          由此可見,從類名稱上的解釋和剛剛從啟動方式上的解釋是吻合的,是一致的。

          這也說明,“時刻關(guān)注細(xì)節(jié),你將發(fā)現(xiàn)更多”。這句話不僅可以用在工作當(dāng)中,亦可以用在學(xué)習(xí)中、生活中。


          細(xì)心的同學(xué)又會發(fā)現(xiàn),后者中還有一個Servlet呢,這又怎么解釋呢?

          這說明這個WebServer是基于Servlet實現(xiàn)的。難道還有不是基于Servlet的嗎?有啊,那就是基于Reactive(響應(yīng)式或反應(yīng)式)的。

          響應(yīng)式使用的類是這個AnnotationConfigReactiveWebServerApplicationContext??梢宰屑?xì)對比一下名字。

          Spring從5.x引入了響應(yīng)式編程。這里不做深入討論,需要的話可以去看“編程新說”這個號之前的文章。


          接著我們?nèi)ピ创a里看看,來證實一下我們的猜想。進(jìn)入ServletWebServerApplicationContext類,就是剛剛那個類的父類。

          首先它定義了一個WebServer,如下圖:

          59e6f2279375682c2b40f26304f38532.webp


          其次又創(chuàng)建了這個WebServer,如下圖:

          7488bff66f93f9f22f19826c1dee8c19.webp


          接著又啟動了這個WebServer,如下圖:

          d982cbf615586753c2a0ca85cdd8cb66.webp


          最后又關(guān)閉和釋放了這個WebServer,如下圖:

          479e2e8feb5cbaea54c9a058c34faab3.webp


          由此證明了我們的猜想,確實有關(guān)于web服務(wù)器的“全套”操作。

          現(xiàn)在SpringBoot翻身成了主人,它不僅可以啟停web服務(wù)器,還可以選擇web服務(wù)器,是用tomcat、jetty還是netty,都是可以配置的。爽吧。


          Spring的核心就是IOC容器,容器所作的事情就是bean定義的注冊,bean的實例化、初始化、依賴的裝配,bean方法的調(diào)用,bean實例的銷毀。

          我們先來看看bean定義的注冊吧。

          首先看下傳統(tǒng)Spring的,也就是AnnotationConfigWebApplicationContext這個類的。

          先定義兩個成員變量,存儲要注冊的類和要掃描的包,如下圖:

          a90efcc17a7bf14838252e61008cf974.webp


          然后又用兩個類AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner來負(fù)責(zé)注冊類和掃描包,如下圖:

          785a63949211e29438c139ef6f6ab773.webp

          6b0b94ed29e8e7c4431810b7c674d248.webp


          最后就是具體的來執(zhí)行注冊類和掃描包,如下圖:


          2e5267853f998868fb4b48828adccaed.webp


          接著再看下SpringBoot的,也就是AnnotationConfigServletWebServerApplicationContext這個類的。

          也是先定義兩個成員變量,和上面的如出一轍,如下圖:

          7c7eb9fd55af3851f3f65f95774c54e8.webp


          也是用相同的兩個類來負(fù)責(zé)處理,如下圖:

          f6215899c63c987d377f8599279008c3.webp

          45c39f03c14115383864a1d38e488e46.webp


          編程新說注
          實例化時雖然調(diào)用的構(gòu)造函數(shù)不同,但是最終執(zhí)行的卻是相同的構(gòu)造函數(shù)。

          最終執(zhí)行具體的處理也是相同的,如下圖:

          291c53a13a1eba290ba5088476ac94b5.webp


          由此可以看出傳統(tǒng)Spring和SpringBoot在對待bean定義注冊這一塊,完全相同,沒有任何區(qū)別。

          其實這很好理解,IOC容器這塊內(nèi)容在Spring中已經(jīng)發(fā)展的相當(dāng)成熟了,是不會再有人輕易去修改它了。

          因此SpringBoot和Spring在本質(zhì)上沒什么差別,注意這里說的是本質(zhì)。

          由于SpringBoot的啟動方式是把自身提前把web服務(wù)器移后(即采用內(nèi)嵌web服務(wù)器),所以這塊是額外新增的內(nèi)容。

          由于SpringBoot采用根據(jù)條件(condition)自動配置的方式(AutoConfiguration),所以這塊也是額外新增的內(nèi)容。

          這兩塊都是額外新增的內(nèi)容,和傳統(tǒng)Spring基本沒啥關(guān)系。

          因此在SpringBoot和Spring重疊的部分,其實本質(zhì)沒啥區(qū)別。



          歡迎加入交流群學(xué)習(xí),備注加群說實話在這個群,哪怕您不說話,光看聊天記錄,都能學(xué)到東西

          兩年嘔心瀝血的文章「面試題」「基礎(chǔ)」「進(jìn)階」這里全都有!

          300多篇原創(chuàng)技術(shù)文章加入交流群學(xué)習(xí)海量視頻資源精美腦圖面試題

          長按掃碼可關(guān)注獲取?

          在看和分享對我非常重要!

          瀏覽 37
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  特色一及片免费看 | 亚洲视频二区 | 欧洲三级片视频 | 黄色一级视频网站 | 激情五月色情在线播放 |