0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深度盤點一遍自動裝配原理(上)

jf_78858299 ? 來源:Java知音 ? 作者: Object ? 2023-04-07 11:18 ? 次閱讀

前言

Spring翻譯為中文是“春天”,的確,在某段時間內(nèi),它給Java開發(fā)人員帶來過春天,但是隨著我們項目規(guī)模的擴大,Spring需要配置的地方就越來越多,夸張點說,“配置兩小時,Coding五分鐘”。這種紛繁復(fù)雜的xml配置隨著軟件行業(yè)一步步地發(fā)展,必將逐步退出歷史舞臺。


SpringBoot介紹

來自:百度百科

Spring Boot是由Pivotal團隊提供的全新框架,其設(shè)計目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程。該框架使用了特定的方式來進行配置,從而使開發(fā)人員不再需要定義樣板化的配置。通過這種方式,Spring Boot致力于在蓬勃發(fā)展的快速應(yīng)用開發(fā)領(lǐng)域(rapid application development)成為領(lǐng)導(dǎo)者。

SpringBoot所具備的特征有:

  • 可以創(chuàng)建獨立的Spring應(yīng)用程序,并且基于其Maven或Gradle插件,可以創(chuàng)建可執(zhí)行的JARs和WARs;
  • 內(nèi)嵌Tomcat或Jetty等Servlet容器;
  • 提供自動配置的“starter”項目對象模型(POMS)以簡化Maven配置;
  • 盡可能自動配置Spring容器;
  • 提供準(zhǔn)備好的特性,如指標(biāo)、健康檢查和外部化配置;
  • 絕對沒有代碼生成,不需要XML配置。

自己的理解:

SpringBoot,顧名思義,給人的感覺就是讓Spring啟動的這么一個項目。在過去,我們要讓一個Spring項目啟動,往往需要配置很多的xml配置文件,但是在使用SpringBoot之后,我們甚至無需寫一行xml,就可以直接將整個項目啟動,這種“零配置”的做法減輕了開發(fā)人員很多的工作量,可以讓開發(fā)人員一心撲在業(yè)務(wù)邏輯的設(shè)計上,使項目的邏輯更加完善。

除此之外,其采用了JavaConfig的配置風(fēng)格,導(dǎo)入組件的方式也由原來的直接配置改為@EnableXXXX,這種純Java代碼的配置和導(dǎo)入組件的方式,使代碼看上去更加的優(yōu)雅,所以SpringBoot如今受到大小公司和大多數(shù)程序員的青睞,不是沒有原因的。

SpringBoot之所以可以做到簡化配置文件直接啟動,無外乎是其內(nèi)部的兩種設(shè)計策略: 開箱即用和約定大于配置 。

開箱即用:在開發(fā)過程中,通過maven項目的pom文件中添加相關(guān)依賴包,然后通過相應(yīng)的注解來代替繁瑣的XML配置以管理對象的生命周期。

約定大于配置:由SpringBoot本身來配置目標(biāo)結(jié)構(gòu),由開發(fā)者在結(jié)構(gòu)中添加信息的軟件設(shè)計范式。這一特點雖降低了部分靈活性,增加了BUG定位的復(fù)雜性,但減少了開發(fā)人員需要做出決定的數(shù)量,同時減少了大量的XML配置,并且可以將代碼編譯、測試和打包等工作自動化。

那么在這篇博客中,我們需要了解的所有東西,就應(yīng)該從這兩個特點出發(fā),一步一步深入SpringBoot自動裝配的原理。


開箱即用原理

要理解這一特點,首先要先自己體會開箱即用的整個過程帶來的便利。

體驗開箱即用

SpringBoot提供了我們快速創(chuàng)建SpringBoot項目的地方:https://start.spring.io/

我們只需要在這個網(wǎng)頁中把整個項目起好名字,然后選好我們需要的組件,就可以直接獲得一個可以跑起來的SpringBoot項目。

圖片

我們只需要填完上述信息,點擊Generate,就可以直接將一個SpringBoot項目下載下來,然后導(dǎo)入我們的IDE,Eclipse或者IDEA都可,之后就可以直接將它運行起來。

全項目結(jié)構(gòu):

圖片

啟動:

圖片

訪問:http://localhost:8080/

圖片

代表整個SpringBoot項目啟動成功。

開箱即用原理剖析

對比SSM配置

其實在上文的開箱即用中,我們相當(dāng)于引入了一個SpringMVC的組件,但是大家可以看到,我們沒有經(jīng)過任何的配置就將項目啟動了。反觀過去SSM框架的SpringMVC配置,我這里有一份留存的大家可以對比一下。

spring-web.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
    
    
    
    <mvc:annotation-driven />

    
    <mvc:resources mapping="/resources/**" location="/resources/" />
    <mvc:default-servlet-handler />

    
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/html/"><span class="hljs-name"property>
        <property name="suffix" value=".html"><span class="hljs-name"property>
    <span class="hljs-name"bean>
    
    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="utf-8"><span class="hljs-name"property>
        <property name="maxUploadSize" value="10485760000"><span class="hljs-name"property>
        <property name="maxInMemorySize" value="20971520"><span class="hljs-name"property>
    <span class="hljs-name"bean>
    
    <bean
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <bean
                    class="org.springframework.http.converter.StringHttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <value>text/html;charset=UTF-8<span class="hljs-name"value>
                        <span class="hljs-name"list>
                    <span class="hljs-name"property>
                <span class="hljs-name"bean>
            <span class="hljs-name"list>
        <span class="hljs-name"property>
    <span class="hljs-name"bean>
    
    <context:component-scan base-package="com.SchoolShop.o2o.web" />
    
<span class="hljs-name"beans>

web.xml:


      name>spring-dispatcherclass="hljs-name"servlet-name>
      class>org.springframework.web.servlet.DispatcherServletclass="hljs-name"servlet-class>
      
          name>contextConfigLocationclass="hljs-name"param-name>
          value>classpath:spring/spring-*.xmlclass="hljs-name"param-value>
      class="hljs-name"init-param>
  class="hljs-name"servlet>
  mapping>
      name>spring-dispatcherclass="hljs-name"servlet-name>
      
      /class="hljs-name"url-pattern>
  class="hljs-name"servlet-mapping>

可以看到,這里需要配置兩個文件,web.xml和spring-web.xml,配置可以說是相當(dāng)繁重。

那么相對于這個,SpringBoot的開箱即用就顯得特別方便,那么我們著重聊聊SpringBoot開箱即用的原理。

從pom.xml開始

SpringBoot的項目都會存在一個父依賴,按住Ctrl+鼠標(biāo)左鍵,可以點進去。

<parent>
    <groupId>org.springframework.boot<span class="hljs-name"groupId>
    <artifactId>spring-boot-starter-parent<span class="hljs-name"artifactId>
    <version>2.2.1.RELEASE<span class="hljs-name"version>
    <relativePath/> 
<span class="hljs-name"parent>

點進去之后發(fā)現(xiàn)里面除了一些插件和配置文件的格式之外,還存在一個依賴。

<parent>
    <groupId>org.springframework.boot<span class="hljs-name"groupId>
    <artifactId>spring-boot-dependencies<span class="hljs-name"artifactId>
    <version>2.2.1.RELEASE<span class="hljs-name"version>
    <relativePath>../../spring-boot-dependencies<span class="hljs-name"relativePath>
<span class="hljs-name"parent>

于是再點進去,可以發(fā)現(xiàn)里面放了很多的依賴和依賴的版本號。由于這個文件實在太長了,所以這里只展示一部分。

圖片

圖片

所以我們可以得出第一個結(jié)論:

spring-boot-dependencies:作為父工程,存放了SpringBoot的核心依賴。我們在寫或者引入一些SpringBoot依賴的時候,不需要指定版本,正是因為SpringBoot的父依賴已經(jīng)幫我們維護了一套版本。

另外我們還可以看到,在父依賴中也幫我們寫好了資源庫,不用我們自己再去配置了。


      
        trueclass="hljs-name"filtering>
        ${basedir}/src/main/resourcesclass="hljs-name"directory>
        <includes>
            
          <include>**/application*.ymlclass="hljs-name"include>
          <include>**/application*.yamlclass="hljs-name"include>
          <include>**/application*.propertiesclass="hljs-name"include>
        class="hljs-name"includes>
      class="hljs-name"resource>
      
        ${basedir}/src/main/resourcesclass="hljs-name"directory>
        
          <exclude>**/application*.ymlclass="hljs-name"exclude>
          <exclude>**/application*.yamlclass="hljs-name"exclude>
          <exclude>**/application*.propertiesclass="hljs-name"exclude>
        class="hljs-name"excludes>
      class="hljs-name"resource>
class="hljs-name"resources>

啟動器

<dependency>
    <groupId>org.springframework.boot<span class="hljs-name"groupId>
    <artifactId>spring-boot-starter<span class="hljs-name"artifactId>
    <version>2.2.1.RELEASE<span class="hljs-name"version>
<span class="hljs-name"dependency>

啟動器就是SpringBoot的啟動場景,比如我們要使用web相關(guān)的,那么就直接引入spring-boor-starter-web,那么他就會幫我們自動導(dǎo)入web環(huán)境下所有必需的依賴。

我們來看看啟動器中存放了一些什么內(nèi)容:

以spring-boot-starter為例:

<dependency>
      <groupId>org.springframework.boot<span class="hljs-name"groupId>
      <artifactId>spring-boot<span class="hljs-name"artifactId>
      <version>2.2.1.RELEASE<span class="hljs-name"version>
      <scope>compile<span class="hljs-name"scope>
    <span class="hljs-name"dependency>
    <dependency>
      <groupId>org.springframework.boot<span class="hljs-name"groupId>
      <artifactId>spring-boot-autoconfigure<span class="hljs-name"artifactId>
      <version>2.2.1.RELEASE<span class="hljs-name"version>
      <scope>compile<span class="hljs-name"scope>
    <span class="hljs-name"dependency>
    <dependency>
      <groupId>org.springframework.boot<span class="hljs-name"groupId>
      <artifactId>spring-boot-starter-logging<span class="hljs-name"artifactId>
      <version>2.2.1.RELEASE<span class="hljs-name"version>
      <scope>compile<span class="hljs-name"scope>
    <span class="hljs-name"dependency>
    <dependency>
      <groupId>jakarta.annotation<span class="hljs-name"groupId>
      <artifactId>jakarta.annotation-api<span class="hljs-name"artifactId>
      <version>1.3.5<span class="hljs-name"version>
      <scope>compile<span class="hljs-name"scope>
    <span class="hljs-name"dependency>
    <dependency>
      <groupId>org.springframework<span class="hljs-name"groupId>
      <artifactId>spring-core<span class="hljs-name"artifactId>
      <version>5.2.1.RELEASE<span class="hljs-name"version>
      <scope>compile<span class="hljs-name"scope>
    <span class="hljs-name"dependency>
    <dependency>
      <groupId>org.yaml<span class="hljs-name"groupId>
      <artifactId>snakeyaml<span class="hljs-name"artifactId>
      <version>1.25<span class="hljs-name"version>
      <scope>runtime<span class="hljs-name"scope>
    <span class="hljs-name"dependency>

其中存放了自動配置相關(guān)的依賴、日志相關(guān)依賴、還有Spring-core等依賴,這些依賴我們只需要導(dǎo)入一個spring-boor-starter就可以直接將其全部引入,而不需要再像以前那樣逐個導(dǎo)入了。

SpringBoot會將所有的功能場景都封裝成一個一個的啟動器,供開發(fā)人員使用。

我們在使用的時候也可以直接去官網(wǎng)上找我們所需的啟動器,直接將其引入。

獲取啟動器文檔:

https://docs.spring.io/spring-boot/docs/2.2.1.RELEASE/reference/html/using-spring-boot.html#using-boot-starter

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2952

    瀏覽量

    104484
  • 開發(fā)
    +關(guān)注

    關(guān)注

    0

    文章

    364

    瀏覽量

    40788
  • 框架
    +關(guān)注

    關(guān)注

    0

    文章

    398

    瀏覽量

    17404
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    338

    瀏覽量

    14295
收藏 人收藏

    評論

    相關(guān)推薦

    ESP32用的開發(fā)版嘗試smartconfig,功能使用正常,但是只要重啟后又要設(shè)置一遍,怎么才能記住配置?

    用的開發(fā)版嘗試smartconfig,功能使用正常,但是只要重啟后又要設(shè)置一遍 怎么才能記住配置?
    發(fā)表于 06-26 07:13

    [轉(zhuǎn)帖]當(dāng)你扛不住的時候就讀一遍

      當(dāng)你扛不住的時候就讀一遍1.不求與人相比,但求超越自己,要哭就哭出激動的淚水,要笑就笑出成長的性格?! ?.與其用淚水悔恨今天,不如用汗水拼. 搏今天?! ?.當(dāng)眼淚流盡的時候
    發(fā)表于 05-24 11:58

    個人認(rèn)為51匯編至少過一遍

    個人認(rèn)為51匯編至少過一遍。現(xiàn)在網(wǎng)上百分之九十的單片機資料都是C 語言的,都適合初學(xué)者入門,我覺得這個不錯的。現(xiàn)在也越來越多的發(fā)燒友認(rèn)為沒必要再學(xué)匯編,直接學(xué)C語言,這當(dāng)然沒錯,可惜,如果你連單片機
    發(fā)表于 08-21 08:22

    主程序執(zhí)行一遍后單片機鎖存器怎么變化?

    例如點亮數(shù)碼管的程序最后行死循環(huán)去掉的話鎖存器是保持狀態(tài)使數(shù)碼管亮著還是執(zhí)行一遍主函數(shù)就滅了?#include***it dula=P2^6;***it wela=P2^7;void main
    發(fā)表于 10-19 18:25

    剛學(xué)STM32,按照個網(wǎng)上找的LED程序,自己寫了一遍,可是...

    剛學(xué)STM32,按照個網(wǎng)上找的LED程序,自己寫了一遍,可是無法編譯?。∏蟠笊駧兔鉀Q下,感激不盡。下面是我寫的程序。
    發(fā)表于 11-04 02:33

    只是為了積分,刷一遍主題

    只是為了積分,刷一遍主題
    發(fā)表于 10-11 11:14

    已經(jīng)跟著入門書籍學(xué)了一遍LabVIEW基礎(chǔ)知識,現(xiàn)在該怎么練手呢

    小白剛起步,過了一遍基本知識后不知如何開展下步,大神們給指導(dǎo)個方向,或者下步需要用的學(xué)習(xí)資料也可以
    發(fā)表于 05-04 16:30

    IAP15W413AS灌程序要先用串口燒錄一遍

    IAP15W413AS灌程序要先用串口燒錄一遍然后在燒錄軟件中選擇下次用485燒錄,為何不能直接用485工具燒錄?是啥原因?。。。?/div>
    發(fā)表于 06-26 18:35

    6678點擊ccml文件debug時當(dāng)前的out文件會給所有的core都下載一遍

    我的板子是EVM6678L的開發(fā)板,ccs5.3版本,現(xiàn)在有個問題,我開始還好好的,突然在次右鍵點擊ccml文件debug時,當(dāng)前的out文件會給所有的core都下載一遍,在debug之前,我已經(jīng)選擇了只是用core0了,不知道為什么?望達人解答
    發(fā)表于 12-28 11:01

    怎么讓液晶把每種顏色都顯示一遍

    原子哥哥,我想讓液晶吧每種顏色都顯示一遍,可是有很多種顏色為顯示出來?#頭文件int main( void ){u16i ; 初始化; do {LCD_Clear( i );i++;delay_ms
    發(fā)表于 03-04 06:35

    請問在bootloader里面已經(jīng)包含的配置在app里面還需要在配置一遍嗎?

    請問大家在bootloader里面已經(jīng)包含的配置在app里面還需要在配置一遍么。。如果在app里面的配置和bootloader里面不樣呢。。望高手給予幫助。。
    發(fā)表于 04-22 03:26

    為什么任哲VC的移植我只能運行一遍?

    只顯示一遍MY,不是循環(huán)顯示。例12-2
    發(fā)表于 11-04 03:47

    英偉達AI機器人開發(fā)新技能 看一遍就能自學(xué)成才

    AI和機器學(xué)習(xí)已經(jīng)流行了很久,但我們通常需要輸入海量的學(xué)習(xí)樣本和已知結(jié)果來讓機器學(xué)習(xí)項新技能。英偉達的研究者為工業(yè)機器人開發(fā)了種新的學(xué)習(xí)方法,和我們?nèi)祟?b class='flag-5'>一樣,機器人能通過觀看其他人的操作直接進行模仿,教
    發(fā)表于 05-23 02:25 ?1902次閱讀

    深度學(xué)習(xí)模型能完成幾項NLP任務(wù)?

    對于機器翻譯、文本摘要、Q&A、文本分類等自然語言處理任務(wù)來說,深度學(xué)習(xí)的出現(xiàn)一遍刷新了state-of-the-art的模型性能記錄,給研究帶來諸多驚喜。但這些任務(wù)般都有各自的度
    的頭像 發(fā)表于 06-26 15:19 ?4524次閱讀

    深度盤點一遍自動裝配原理(下)

    Spring Boot是由Pivotal團隊提供的全新框架,其設(shè)計目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程。該框架使用了特定的方式來進行配置,從而使開發(fā)人員不再需要定義樣板化的配置。通過這種方式,Spring Boot致力于在蓬勃發(fā)展的快速應(yīng)用開發(fā)領(lǐng)域(rapid application development)成為領(lǐng)導(dǎo)者。
    的頭像 發(fā)表于 04-07 11:18 ?392次閱讀
    <b class='flag-5'>深度</b><b class='flag-5'>盤點</b><b class='flag-5'>一遍</b><b class='flag-5'>自動</b><b class='flag-5'>裝配</b>原理(下)