欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring Boot實(shí)戰(zhàn)之逐行釋義Hello World程序

 更新時(shí)間:2017年12月26日 08:37:31   作者:liuxiaopeng  
spring boot 是基于Spring的一個(gè)框架,Spring boot幫我們集成很多常用的功能,使得整個(gè)配置更加簡單。這篇文章主要介紹了Spring Boot實(shí)戰(zhàn)之逐行釋義Hello World,需要的朋友可以參考下

一、前言

   研究Spring boot也有一小段時(shí)間了,最近會(huì)將研究東西整理一下給大家分享,大概會(huì)有10~20篇左右的博客,整個(gè)系列會(huì)以一個(gè)簡單的博客系統(tǒng)作為基礎(chǔ),因?yàn)楣庵v理論很多東西不是特別容易理解,并且如果每次通過一個(gè)簡單的小程序也無法系統(tǒng)的把握好一些知識點(diǎn),所以就以一個(gè)簡單的系統(tǒng)作為基礎(chǔ)來講,看看通過spring boot如何實(shí)現(xiàn)一個(gè)完整系統(tǒng)。本系列除了Spring boot基本的知識點(diǎn)之外,還會(huì)涉及到Spring boot與數(shù)據(jù)庫、緩存(redis)、消息隊(duì)列等的結(jié)合以及多實(shí)例部署等方面的內(nèi)容。有興趣的同學(xué)可以關(guān)注一下。

二、Spring boot 簡介

   Spring boot 從名稱上就可以看出,它是基于Spring的一個(gè)框架,所以不熟悉Spring的同學(xué)還是得先去學(xué)習(xí)一下Spring。其次,Spring boot幫我們集成很多常用的功能,使得整個(gè)配置更加簡單。用過Spring的同學(xué)應(yīng)該知道,雖然Spring一直在努力的減少配置的復(fù)雜性,但是,配置一個(gè)完全可用的(web)環(huán)境還是挺麻煩的,比如需要配置日志、數(shù)據(jù)庫、緩存等,然后再配置tomcat,最后將程序發(fā)布到tomcat目錄下。而Spring boot則幫我們大大簡化了這個(gè)過程,它提供了很多starter,只要引入對應(yīng)的jar包就可以了。例如,我們需要集成tomcat,只需要引入tomcat的starter即可:

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>

  備注:本文的例子都是基于Maven來實(shí)現(xiàn)的,所以如果不熟悉Maven,可以先去看下怎么用,如果熟悉gradle的話,也可以根據(jù)情況對配置做相應(yīng)調(diào)整。

  我們可以從官方文檔上查看Spring boot提供的starter:

  這里我只截取了一小部分,可以看到Spring boot支持緩存、批處理、mq、es等等,完整的列表參考官方文檔。其他就不多解釋了,后續(xù)通過示例來講解整個(gè)Spring boot功能,我們先看Spring boot來如何實(shí)現(xiàn)一個(gè)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;
 }
}

  第三步:編寫啟動(dòng)類(入庫)

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);
 }
}

 運(yùn)行該類的main方法,然后訪問http://localhost:8080/hello,就可以看到如下結(jié)果:

  是不是感覺很開心?一行配置都沒有,就可以直接運(yùn)行一個(gè)Web應(yīng)用。不過開心完以后有沒有想過這是怎么實(shí)現(xiàn)的呢?接下來我們一行一行解析上面的代碼,雖然行數(shù)不多,但是還是有很多東西值得我們?nèi)W(xué)習(xí)和理解的。

  3.2 pom文件分析

  我們先從pom文件入手,pom文件里面只引入了兩個(gè)依賴項(xiàng)。第一個(gè)是spring-boot-starter-parent,熟悉Maven的朋友應(yīng)該知道,Maven也可以跟類一樣,從父pom文件中繼承配置。我們可以看下spring-boot-starter-parent的pom文件,由于篇幅問題,這里面只看兩部分,其他東西比較容易理解,大家可以自己讀一下。第一個(gè)部分是:

  該文件又繼承了另一個(gè)pom文件,即spring-boot-dependencies,這個(gè)文件其實(shí)就是包含了一大堆的jar,其作用是統(tǒng)一管理spring boot所依賴的jar包的版本,所以之后大家可以看到,各個(gè)組件里面引入jar的時(shí)候就不再需要再指定版本號了。另一個(gè)地方需要說明一下是配置文件的管理:

  大家可以看到,默認(rèn)情況下會(huì)將/src/main/resources目錄下的文件作為資源文件加入到classpath下,另外,這個(gè)地方的僅僅對application*.yml,application*.yaml,application*.properties三種文件進(jìn)行過濾。這個(gè)過濾是指什么呢?大家配置過spring mvc的人應(yīng)該都知道,配置數(shù)據(jù)庫時(shí),我們通常將數(shù)據(jù)庫的信息配置在一個(gè)properties文件中,然后在spring的配置文件中通過<property name="driverClass" value="${jdbc.driver}" /> 的形式引入,這個(gè)filter的作用就是在編譯的時(shí)候?qū)⑴渲梦募信渲玫拿祵μ鎿Q到spring的配置文件中${xxx}字符,但這個(gè)功能不是必要的,即使不進(jìn)行替換,Spring也能在運(yùn)行時(shí)讀取到配置項(xiàng)。

  總結(jié)一下:spring-boot-starter-parent的作用::

  1)jar包管理。

  2)默認(rèn)配置文件管理。

  3)常用插件管理。

  其實(shí)從什么的分析可以看出,spring-boot-starter-parent最核心的功能是管理了Spring boot所依賴的所有jar包。不過通parent的方式有一個(gè)很明顯的問題,很多公司自己有自己的parent文件,而maven是沒辦法配置多個(gè)parent的。如果不使用spring-boot-starter-parent,那應(yīng)該怎么做?難道需要自己一個(gè)一個(gè)jar包導(dǎo)入?實(shí)際上Spring boot提供了另一種方式來解決這個(gè)問題,就是在自己的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>

  其實(shí)從上面的分析可以看到,這個(gè)也是spring-boot-starter-parent 的pom文件的parent,而這個(gè)pom文件里面主要就是管理了一大堆的jar包。所以導(dǎo)入這個(gè)后,就不需要自己再一個(gè)一個(gè)jar去導(dǎo)入了。但是這樣的話,spring-boot-starter-parent中的插件就無法使用,并且默認(rèn)配置文件的替換功能也沒有了。不過這沒什么影響,一方面這些功能不是必須的,另一方面如果需要,自己添加也是件很容易的事情?! ?/p>

  3.3 HelloWorld類解析:

  我們再看下HelloWorld這個(gè)類,用過Spring mvc應(yīng)該知道,其實(shí)這個(gè)類跟Spring boot沒半毛錢關(guān)系,業(yè)務(wù)代碼更是沒任何跟spring相關(guān)的東西,這也是spring一直奉行的一個(gè)原則,侵入性極小,這也是Spring成功的一個(gè)主要原因。這個(gè)類里面跟spring相關(guān)的是三個(gè)注解,即@Controller,@RequestMapping,@ResponseBody,但是這三個(gè)注解也都是Spring mvc提供的。跟Spring boot沒有太多聯(lián)系,在這我就不細(xì)講了,如果不是很清楚,可以去看下Spring MVC的內(nèi)容,三個(gè)注解的基本作用如下:

  • Controller:標(biāo)識為一個(gè)控制器,spring會(huì)自動(dòng)實(shí)例化該類。
  • RequestMapping:url映射。
  • ResponseBody:將返回結(jié)果自動(dòng)轉(zhuǎn)換為json串。

  3.4 Application類解析

  最后我們看下Application這個(gè)類,你會(huì)發(fā)現(xiàn)這個(gè)類的東西更少,總共就一行有用的代碼,即SpringApplication.run(Application.class, args);這個(gè)方法的作用是加載Application這個(gè)類,那Application這個(gè)類有什么特別之處嗎?可以看一下,其實(shí)這個(gè)類的唯一特殊的地方是一個(gè)注解@SpringBootApplication,所以Spring boot的運(yùn)行肯定跟這個(gè)注解有著諸多的聯(lián)系,我們可以看下這個(gè)注解的源碼:

@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 {

  該注解的主要方法就不說了,大家看下就知道,主要是為上面這些注解提供別名。該注解上前四個(gè)注解(@Target(ElementType.TYPE),@Retention(RetentionPolicy.RUNTIME),@Documented,@Inherited)大家應(yīng)該都知道,不熟悉的朋友自己去看下JDK如何實(shí)現(xiàn)自定義的注解。我們詳細(xì)解釋一下后面三個(gè)注解:@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan。

  先看一下SpringBootConfiguration,這個(gè)注解比較簡單,源碼如下:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}

  這個(gè)注解僅僅是繼承了@Configuration,大家應(yīng)該知道,Spring提供三種方式的配置:(1)xml文件配置(2)annotation配置(3)Java 類配置。而@Configuration就是用于標(biāo)識一個(gè)類為配置類的注解。Spring 4以后比較推崇通過Java類的方式來進(jìn)行配置,所以Spring boot也傾向于這種方配置式。并且從源碼可以看出,SpringBootConfiguration的作用就是標(biāo)識類為配置類。

  接下來我們看一下@EnableAutoConfiguration注解,這個(gè)注解的源碼有點(diǎn)復(fù)雜,在這不做細(xì)講,后面的文章再詳細(xì)解析期實(shí)現(xiàn)方式。這里說一下該注解的作用,它的主要功能是實(shí)現(xiàn)自動(dòng)配置,什么叫做自動(dòng)配置?就是Spring boot會(huì)根據(jù)你引入的jar包做一些自動(dòng)的配置,例如,在classpath有HSQLDB的jar,spring boot就會(huì)自動(dòng)給你配置一個(gè)內(nèi)存數(shù)據(jù)庫。在這個(gè)例子里面我們也可以看到,因?yàn)槲覀円肓薙pring-mvc、tomcat等相關(guān)的jar,spring boot就會(huì)猜測你是一個(gè)web工程,然后就會(huì)自動(dòng)做一些spring mvc的配置,比如對靜態(tài)資源的支持、將返回結(jié)果自動(dòng)轉(zhuǎn)為json格式數(shù)據(jù)的支持等。這些都是自動(dòng)配置的結(jié)果。對Spring Enable*注解熟悉的同學(xué)應(yīng)該能夠更容易理解這個(gè)注解,因?yàn)镾pring中有很多類似的注解。

  最后我們再看下@ComponentScan,這個(gè)注解不是Spring boot提供的,而是Spring提供的,Spring掃描的包或類,即哪些包和類會(huì)自動(dòng)納入Spring IoC容器的管理,IoC根據(jù)配置對這些類進(jìn)行實(shí)例化。

   現(xiàn)在我們再總結(jié)一下SpringBootConfiguration這個(gè)注解的作用:

  1)標(biāo)志該類為一個(gè)配置類。
  2)指定掃描的包,便于Spring IoC容器對其進(jìn)行實(shí)例和生命周期的管理。
  3)自動(dòng)配置,通過引入的jar包,猜測用戶的意圖進(jìn)行自動(dòng)化配置。

四、總結(jié)

   本文詳細(xì)分析了Spring boot實(shí)現(xiàn)的一個(gè)web版的Hello World,通過這個(gè)例子,我們了解了Spring boot的基本操作,并通過對每行的代碼的分析,對Spring boot的原理有了一個(gè)大致的了解??傮w來講,Spring boot 統(tǒng)一管理了jar包,然后會(huì)根據(jù)我們選擇的starter來進(jìn)行自動(dòng)化配置,通過這種方式來解決復(fù)雜的依賴管理,精簡配置,從而使得開發(fā)者能夠更加專注于自己的業(yè)務(wù),而不需要做那些很復(fù)雜的配置工作。同時(shí),Spring boot這種快速、輕量級的服務(wù)也非常適合微服務(wù)架構(gòu),這個(gè)后續(xù)有機(jī)會(huì)再跟大家分享,歡迎繼續(xù)關(guān)注。

相關(guān)文章

  • 詳解Java異常處理中throw與throws關(guān)鍵字的用法區(qū)別

    詳解Java異常處理中throw與throws關(guān)鍵字的用法區(qū)別

    這篇文章主要介紹了詳解Java異常處理中throw與throws關(guān)鍵字的用法區(qū)別,這也是Java面試題目中的???需要的朋友可以參考下
    2015-11-11
  • 詳細(xì)了解MVC+proxy

    詳細(xì)了解MVC+proxy

    Java有兩種代理方式,一種是靜態(tài)代理,另一種是動(dòng)態(tài)代理。對于靜態(tài)代理,其實(shí)就是通過依賴注入,對對象進(jìn)行封裝,不讓外部知道實(shí)現(xiàn)的細(xì)節(jié)。很多 API 就是通過這種形式來封裝的
    2021-07-07
  • Java Exception 捕獲和顯示實(shí)例詳解

    Java Exception 捕獲和顯示實(shí)例詳解

    這篇文章主要介紹了Java Exception 捕獲和顯示實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 深入探究Java線程與進(jìn)程有哪些區(qū)別

    深入探究Java線程與進(jìn)程有哪些區(qū)別

    這篇文章主要介紹了Java并發(fā)編程之線程創(chuàng)建,進(jìn)程是代碼在數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,線程則是一個(gè)實(shí)體,一個(gè)進(jìn)程中至少有一個(gè)線程,下文更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-04-04
  • java中int、double、char等變量的取值范圍詳析

    java中int、double、char等變量的取值范圍詳析

    這篇文章主要給大家介紹了關(guān)于java中int、double、char等變量取值范圍的相關(guān)資料,每個(gè)變量都給出了詳細(xì)的實(shí)例代碼,對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-10-10
  • Java源碼解析ArrayList及ConcurrentModificationException

    Java源碼解析ArrayList及ConcurrentModificationException

    今天小編就為大家分享一篇關(guān)于Java源碼解析ArrayList及ConcurrentModificationException,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Spring注解開發(fā)生命周期原理解析

    Spring注解開發(fā)生命周期原理解析

    這篇文章主要介紹了Spring注解開發(fā)生命周期原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java中Static關(guān)鍵字的五種用法詳解

    Java中Static關(guān)鍵字的五種用法詳解

    這篇文章主要介紹了Java中static的五種用法:修飾成員變量,修飾成員方法,修飾內(nèi)部類,靜態(tài)代碼塊,靜態(tài)導(dǎo)包,想詳細(xì)了解的小伙伴可以參考閱讀本文
    2023-03-03
  • IDEA中Maven報(bào)錯(cuò)Cannot resolve xxx的解決方法匯總(親測有效)

    IDEA中Maven報(bào)錯(cuò)Cannot resolve xxx的解決方法匯總(親測有效)

    在IDEA中的pom文件中添加了依賴,并且正確加載了相應(yīng)依賴,pom文件沒有報(bào)紅,看起來像是把所有依賴庫全部加載進(jìn)來了,但是代碼中使用依賴的類庫使報(bào)紅,本文給大家介紹了IDEA中Maven報(bào)錯(cuò)Cannot resolve xxx的解決方法匯總,需要的朋友可以參考下
    2024-06-06
  • Java簡單實(shí)現(xiàn)農(nóng)夫過河問題示例

    Java簡單實(shí)現(xiàn)農(nóng)夫過河問題示例

    這篇文章主要介紹了Java簡單實(shí)現(xiàn)農(nóng)夫過河問題,簡單描述了農(nóng)夫過河問題的概念、原理并結(jié)合簡單實(shí)例形式分析了java解決農(nóng)夫過河問題的相關(guān)操作技巧,需要的朋友可以參考下
    2017-12-12

最新評論