您好,登錄后才能下訂單哦!
小編給大家分享一下Spring Boot中如何逐行釋義Hello World程序,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
一、前言
研究Spring boot也有一小段時間了,最近會將研究東西整理一下給大家分享,大概會有10~20篇左右的博客,整個系列會以一個簡單的博客系統(tǒng)作為基礎(chǔ),因為光講理論很多東西不是特別容易理解,并且如果每次通過一個簡單的小程序也無法系統(tǒng)的把握好一些知識點,所以就以一個簡單的系統(tǒng)作為基礎(chǔ)來講,看看通過spring boot如何實現(xiàn)一個完整系統(tǒng)。本系列除了Spring boot基本的知識點之外,還會涉及到Spring boot與數(shù)據(jù)庫、緩存(redis)、消息隊列等的結(jié)合以及多實例部署等方面的內(nèi)容。有興趣的同學(xué)可以關(guān)注一下。
二、Spring boot 簡介
Spring boot 從名稱上就可以看出,它是基于Spring的一個框架,所以不熟悉Spring的同學(xué)還是得先去學(xué)習(xí)一下Spring。其次,Spring boot幫我們集成很多常用的功能,使得整個配置更加簡單。用過Spring的同學(xué)應(yīng)該知道,雖然Spring一直在努力的減少配置的復(fù)雜性,但是,配置一個完全可用的(web)環(huán)境還是挺麻煩的,比如需要配置日志、數(shù)據(jù)庫、緩存等,然后再配置tomcat,最后將程序發(fā)布到tomcat目錄下。而Spring boot則幫我們大大簡化了這個過程,它提供了很多starter,只要引入對應(yīng)的jar包就可以了。例如,我們需要集成tomcat,只需要引入tomcat的starter即可:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </dependency>
備注:本文的例子都是基于Maven來實現(xiàn)的,所以如果不熟悉Maven,可以先去看下怎么用,如果熟悉gradle的話,也可以根據(jù)情況對配置做相應(yīng)調(diào)整。
我們可以從官方文檔上查看Spring boot提供的starter:
這里我只截取了一小部分,可以看到Spring boot支持緩存、批處理、mq、es等等,完整的列表參考官方文檔。其他就不多解釋了,后續(xù)通過示例來講解整個Spring boot功能,我們先看Spring boot來如何實現(xiàn)一個web版的Hello World!
三、Hello World程序
3.1 Hello World 源碼
第一步:導(dǎo)入jar包
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
第二步:編寫控制器類
package com.pandy.blog; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import java.util.HashMap; import java.util.Map; @Controller public class HelloWorld { @RequestMapping("/hello") @ResponseBody public Map<String, Object> hello() { Map<String, Object> map = new HashMap<>(); map.put("hello", "world"); return map; } }
第三步:編寫啟動類(入庫)
package com.pandy.blog; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) throws Exception { SpringApplication.run(Application.class, args); } }
運行該類的main方法,然后訪問http://localhost:8080/hello,就可以看到如下結(jié)果:
是不是感覺很開心?一行配置都沒有,就可以直接運行一個Web應(yīng)用。不過開心完以后有沒有想過這是怎么實現(xiàn)的呢?接下來我們一行一行解析上面的代碼,雖然行數(shù)不多,但是還是有很多東西值得我們?nèi)W(xué)習(xí)和理解的。
3.2 pom文件分析
我們先從pom文件入手,pom文件里面只引入了兩個依賴項。第一個是spring-boot-starter-parent,熟悉Maven的朋友應(yīng)該知道,Maven也可以跟類一樣,從父pom文件中繼承配置。我們可以看下spring-boot-starter-parent的pom文件,由于篇幅問題,這里面只看兩部分,其他東西比較容易理解,大家可以自己讀一下。第一個部分是:
該文件又繼承了另一個pom文件,即spring-boot-dependencies,這個文件其實就是包含了一大堆的jar,其作用是統(tǒng)一管理spring boot所依賴的jar包的版本,所以之后大家可以看到,各個組件里面引入jar的時候就不再需要再指定版本號了。另一個地方需要說明一下是配置文件的管理:
大家可以看到,默認(rèn)情況下會將/src/main/resources目錄下的文件作為資源文件加入到classpath下,另外,這個地方的僅僅對application*.yml,application*.yaml,application*.properties三種文件進(jìn)行過濾。這個過濾是指什么呢?大家配置過spring mvc的人應(yīng)該都知道,配置數(shù)據(jù)庫時,我們通常將數(shù)據(jù)庫的信息配置在一個properties文件中,然后在spring的配置文件中通過<property name="driverClass" value="${jdbc.driver}" /> 的形式引入,這個filter的作用就是在編譯的時候?qū)⑴渲梦募信渲玫拿祵μ鎿Q到spring的配置文件中${xxx}字符,但這個功能不是必要的,即使不進(jìn)行替換,Spring也能在運行時讀取到配置項。
總結(jié)一下:spring-boot-starter-parent的作用::
1)jar包管理。
2)默認(rèn)配置文件管理。
3)常用插件管理。
其實從什么的分析可以看出,spring-boot-starter-parent最核心的功能是管理了Spring boot所依賴的所有jar包。不過通parent的方式有一個很明顯的問題,很多公司自己有自己的parent文件,而maven是沒辦法配置多個parent的。如果不使用spring-boot-starter-parent,那應(yīng)該怎么做?難道需要自己一個一個jar包導(dǎo)入?實際上Spring boot提供了另一種方式來解決這個問題,就是在自己的pom文件中加入spring boot的依賴的管理:
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>1.5.9.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
其實從上面的分析可以看到,這個也是spring-boot-starter-parent 的pom文件的parent,而這個pom文件里面主要就是管理了一大堆的jar包。所以導(dǎo)入這個后,就不需要自己再一個一個jar去導(dǎo)入了。但是這樣的話,spring-boot-starter-parent中的插件就無法使用,并且默認(rèn)配置文件的替換功能也沒有了。不過這沒什么影響,一方面這些功能不是必須的,另一方面如果需要,自己添加也是件很容易的事情?! ?/p>
3.3 HelloWorld類解析:
我們再看下HelloWorld這個類,用過Spring mvc應(yīng)該知道,其實這個類跟Spring boot沒半毛錢關(guān)系,業(yè)務(wù)代碼更是沒任何跟spring相關(guān)的東西,這也是spring一直奉行的一個原則,侵入性極小,這也是Spring成功的一個主要原因。這個類里面跟spring相關(guān)的是三個注解,即@Controller,@RequestMapping,@ResponseBody,但是這三個注解也都是Spring mvc提供的。跟Spring boot沒有太多聯(lián)系,在這我就不細(xì)講了,如果不是很清楚,可以去看下Spring MVC的內(nèi)容,三個注解的基本作用如下:
Controller:標(biāo)識為一個控制器,spring會自動實例化該類。
RequestMapping:url映射。
ResponseBody:將返回結(jié)果自動轉(zhuǎn)換為json串。
3.4 Application類解析
最后我們看下Application這個類,你會發(fā)現(xiàn)這個類的東西更少,總共就一行有用的代碼,即SpringApplication.run(Application.class, args);這個方法的作用是加載Application這個類,那Application這個類有什么特別之處嗎?可以看一下,其實這個類的唯一特殊的地方是一個注解@SpringBootApplication,所以Spring boot的運行肯定跟這個注解有著諸多的聯(lián)系,我們可以看下這個注解的源碼:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public @interface SpringBootApplication {
該注解的主要方法就不說了,大家看下就知道,主要是為上面這些注解提供別名。該注解上前四個注解(@Target(ElementType.TYPE),@Retention(RetentionPolicy.RUNTIME),@Documented,@Inherited)大家應(yīng)該都知道,不熟悉的朋友自己去看下JDK如何實現(xiàn)自定義的注解。我們詳細(xì)解釋一下后面三個注解:@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan。
先看一下SpringBootConfiguration,這個注解比較簡單,源碼如下:
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration { }
這個注解僅僅是繼承了@Configuration,大家應(yīng)該知道,Spring提供三種方式的配置:(1)xml文件配置(2)annotation配置(3)Java 類配置。而@Configuration就是用于標(biāo)識一個類為配置類的注解。Spring 4以后比較推崇通過Java類的方式來進(jìn)行配置,所以Spring boot也傾向于這種方配置式。并且從源碼可以看出,SpringBootConfiguration的作用就是標(biāo)識類為配置類。
接下來我們看一下@EnableAutoConfiguration注解,這個注解的源碼有點復(fù)雜,在這不做細(xì)講,后面的文章再詳細(xì)解析期實現(xiàn)方式。這里說一下該注解的作用,它的主要功能是實現(xiàn)自動配置,什么叫做自動配置?就是Spring boot會根據(jù)你引入的jar包做一些自動的配置,例如,在classpath有HSQLDB的jar,spring boot就會自動給你配置一個內(nèi)存數(shù)據(jù)庫。在這個例子里面我們也可以看到,因為我們引入了Spring-mvc、tomcat等相關(guān)的jar,spring boot就會猜測你是一個web工程,然后就會自動做一些spring mvc的配置,比如對靜態(tài)資源的支持、將返回結(jié)果自動轉(zhuǎn)為json格式數(shù)據(jù)的支持等。這些都是自動配置的結(jié)果。對Spring Enable*注解熟悉的同學(xué)應(yīng)該能夠更容易理解這個注解,因為Spring中有很多類似的注解。
最后我們再看下@ComponentScan,這個注解不是Spring boot提供的,而是Spring提供的,Spring掃描的包或類,即哪些包和類會自動納入Spring IoC容器的管理,IoC根據(jù)配置對這些類進(jìn)行實例化。
現(xiàn)在我們再總結(jié)一下SpringBootConfiguration這個注解的作用:
1)標(biāo)志該類為一個配置類。
2)指定掃描的包,便于Spring IoC容器對其進(jìn)行實例和生命周期的管理。
3)自動配置,通過引入的jar包,猜測用戶的意圖進(jìn)行自動化配置。
以上是“Spring Boot中如何逐行釋義Hello World程序”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。