前言
Spring翻譯為中文是“春天”,的確,在某段時(shí)間內(nèi),它給Java開發(fā)人員帶來過春天,但是隨著我們項(xiàng)目規(guī)模的擴(kuò)大,Spring需要配置的地方就越來越多,夸張點(diǎn)說,“配置兩小時(shí),Coding五分鐘”。這種紛繁復(fù)雜的xml配置隨著軟件行業(yè)一步步地發(fā)展,必將逐步退出歷史舞臺(tái)。
SpringBoot介紹
來自:百度百科
Spring Boot是由Pivotal團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程。該框架使用了特定的方式來進(jìn)行配置,從而使開發(fā)人員不再需要定義樣板化的配置。通過這種方式,Spring Boot致力于在蓬勃發(fā)展的快速應(yīng)用開發(fā)領(lǐng)域(rapid application development)成為領(lǐng)導(dǎo)者。
SpringBoot所具備的特征有:
- 可以創(chuàng)建獨(dú)立的Spring應(yīng)用程序,并且基于其Maven或Gradle插件,可以創(chuàng)建可執(zhí)行的JARs和WARs;
- 內(nèi)嵌Tomcat或Jetty等Servlet容器;
- 提供自動(dòng)配置的“starter”項(xiàng)目對(duì)象模型(POMS)以簡化Maven配置;
- 盡可能自動(dòng)配置Spring容器;
- 提供準(zhǔn)備好的特性,如指標(biāo)、健康檢查和外部化配置;
- 絕對(duì)沒有代碼生成,不需要XML配置。
自己的理解:
SpringBoot,顧名思義,給人的感覺就是讓Spring啟動(dòng)的這么一個(gè)項(xiàng)目。在過去,我們要讓一個(gè)Spring項(xiàng)目啟動(dòng),往往需要配置很多的xml配置文件,但是在使用SpringBoot之后,我們甚至無需寫一行xml,就可以直接將整個(gè)項(xiàng)目啟動(dòng),這種“零配置”的做法減輕了開發(fā)人員很多的工作量,可以讓開發(fā)人員一心撲在業(yè)務(wù)邏輯的設(shè)計(jì)上,使項(xiàng)目的邏輯更加完善。
除此之外,其采用了JavaConfig的配置風(fēng)格,導(dǎo)入組件的方式也由原來的直接配置改為@EnableXXXX,這種純Java代碼的配置和導(dǎo)入組件的方式,使代碼看上去更加的優(yōu)雅,所以SpringBoot如今受到大小公司和大多數(shù)程序員的青睞,不是沒有原因的。
SpringBoot之所以可以做到簡化配置文件直接啟動(dòng),無外乎是其內(nèi)部的兩種設(shè)計(jì)策略: 開箱即用和約定大于配置 。
開箱即用:在開發(fā)過程中,通過maven項(xiàng)目的pom文件中添加相關(guān)依賴包,然后通過相應(yīng)的注解來代替繁瑣的XML配置以管理對(duì)象的生命周期。
約定大于配置:由SpringBoot本身來配置目標(biāo)結(jié)構(gòu),由開發(fā)者在結(jié)構(gòu)中添加信息的軟件設(shè)計(jì)范式。這一特點(diǎn)雖降低了部分靈活性,增加了BUG定位的復(fù)雜性,但減少了開發(fā)人員需要做出決定的數(shù)量,同時(shí)減少了大量的XML配置,并且可以將代碼編譯、測試和打包等工作自動(dòng)化。
那么在這篇博客中,我們需要了解的所有東西,就應(yīng)該從這兩個(gè)特點(diǎn)出發(fā),一步一步深入SpringBoot自動(dòng)裝配的原理。
開箱即用原理
要理解這一特點(diǎn),首先要先自己體會(huì)開箱即用的整個(gè)過程帶來的便利。
體驗(yàn)開箱即用
SpringBoot提供了我們快速創(chuàng)建SpringBoot項(xiàng)目的地方:https://start.spring.io/
我們只需要在這個(gè)網(wǎng)頁中把整個(gè)項(xiàng)目起好名字,然后選好我們需要的組件,就可以直接獲得一個(gè)可以跑起來的SpringBoot項(xiàng)目。
我們只需要填完上述信息,點(diǎn)擊Generate,就可以直接將一個(gè)SpringBoot項(xiàng)目下載下來,然后導(dǎo)入我們的IDE,Eclipse或者IDEA都可,之后就可以直接將它運(yùn)行起來。
全項(xiàng)目結(jié)構(gòu):
啟動(dòng):
訪問:http://localhost:8080/
代表整個(gè)SpringBoot項(xiàng)目啟動(dòng)成功。
開箱即用原理剖析
對(duì)比SSM配置
其實(shí)在上文的開箱即用中,我們相當(dāng)于引入了一個(gè)SpringMVC的組件,但是大家可以看到,我們沒有經(jīng)過任何的配置就將項(xiàng)目啟動(dòng)了。反觀過去SSM框架的SpringMVC配置,我這里有一份留存的大家可以對(duì)比一下。
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>
可以看到,這里需要配置兩個(gè)文件,web.xml和spring-web.xml,配置可以說是相當(dāng)繁重。
那么相對(duì)于這個(gè),SpringBoot的開箱即用就顯得特別方便,那么我們著重聊聊SpringBoot開箱即用的原理。
從pom.xml開始
SpringBoot的項(xiàng)目都會(huì)存在一個(gè)父依賴,按住Ctrl+鼠標(biāo)左鍵,可以點(diǎn)進(jìn)去。
<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>
點(diǎn)進(jìn)去之后發(fā)現(xiàn)里面除了一些插件和配置文件的格式之外,還存在一個(gè)依賴。
<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>
于是再點(diǎn)進(jìn)去,可以發(fā)現(xiàn)里面放了很多的依賴和依賴的版本號(hào)。由于這個(gè)文件實(shí)在太長了,所以這里只展示一部分。
所以我們可以得出第一個(gè)結(jié)論:
spring-boot-dependencies:作為父工程,存放了SpringBoot的核心依賴。我們在寫或者引入一些SpringBoot依賴的時(shí)候,不需要指定版本,正是因?yàn)镾pringBoot的父依賴已經(jīng)幫我們維護(hù)了一套版本。
另外我們還可以看到,在父依賴中也幫我們寫好了資源庫,不用我們自己再去配置了。
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>
啟動(dòng)器
<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>
啟動(dòng)器就是SpringBoot的啟動(dòng)場景,比如我們要使用web相關(guān)的,那么就直接引入spring-boor-starter-web,那么他就會(huì)幫我們自動(dòng)導(dǎo)入web環(huán)境下所有必需的依賴。
我們來看看啟動(dòng)器中存放了一些什么內(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>
其中存放了自動(dòng)配置相關(guān)的依賴、日志相關(guān)依賴、還有Spring-core等依賴,這些依賴我們只需要導(dǎo)入一個(gè)spring-boor-starter就可以直接將其全部引入,而不需要再像以前那樣逐個(gè)導(dǎo)入了。
SpringBoot會(huì)將所有的功能場景都封裝成一個(gè)一個(gè)的啟動(dòng)器,供開發(fā)人員使用。
我們在使用的時(shí)候也可以直接去官網(wǎng)上找我們所需的啟動(dòng)器,直接將其引入。
獲取啟動(dòng)器文檔:
https://docs.spring.io/spring-boot/docs/2.2.1.RELEASE/reference/html/using-spring-boot.html#using-boot-starter
-
JAVA
+關(guān)注
關(guān)注
19文章
2970瀏覽量
104808 -
開發(fā)
+關(guān)注
關(guān)注
0文章
370瀏覽量
40855 -
框架
+關(guān)注
關(guān)注
0文章
403瀏覽量
17504 -
spring
+關(guān)注
關(guān)注
0文章
340瀏覽量
14353
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論