springboot基礎

SpringBoot簡介:

1裙士、Spring的優(yōu)缺點分析:


image.png

1.2 SpringBoot的概述

1.2.1 SpringBoot解決上述Spring的缺點

SpringBoot對上述Spring的缺點進行的改善和優(yōu)化把敢,基于約定優(yōu)于配置的思想穷绵,可以讓開發(fā)人員不必在配置與邏輯業(yè)務之間進行思維的切換,全身心的投入到邏輯業(yè)務的代碼編寫中堡距,從而大大提高了開發(fā)的效率拦惋,一定程度上縮短了項目周期衙耕。

1.2.2 SpringBoot的特點

  • 為基于Spring的開發(fā)提供更快的入門體驗
  • 開箱即用,沒有代碼生成凡壤,也無需XML配置署尤。同時也可以修改默認值來滿足特定的需求
  • 提供了一些大型項目中常見的非功能性特性,如嵌入式服務器亚侠、安全曹体、指標,健康檢測硝烂、外部配置等
  • SpringBoot不是對Spring功能上的增強箕别,而是提供了一種快速使用Spring的方式

1.2.3 SpringBoot的核心功能

  • 起步依賴

    起步依賴本質(zhì)上是一個Maven項目對象模型(Project Object Model,POM)滞谢,定義了對其他庫的傳遞依賴串稀,這些東西加在一起即支持某項功能。

    簡單的說狮杨,起步依賴就是將具備某種功能的坐標打包到一起母截,并提供一些默認的功能。

  • 自動配置

    Spring Boot的自動配置是一個運行時(更準確地說橄教,是應用程序啟動時)的過程清寇,考慮了眾多因素,才決定Spring配置應該用哪個颤陶,不該用哪個颗管。該過程是Spring自動完成的。

二滓走、SpringBoot快速入門

2.1 代碼實現(xiàn)

2.1.1 創(chuàng)建Maven工程

使用idea工具創(chuàng)建一個maven工程垦江,該工程為普通的java工程即可
添加Springboot啟動依賴

2.1.2 添加SpringBoot的起步依賴

SpringBoot要求,項目要繼承SpringBoot的起步依賴spring-boot-starter-parent

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
</parent>

SpringBoot要集成SpringMVC進行Controller的開發(fā)搅方,所以項目要導入web的啟動依賴

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

編寫SpringBoot引導類

package com.itheima;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MySpringBootApplication {

    public static void main(String[] args) {
        SpringApplication.run(MySpringBootApplication.class);
    }

}

2.1.4 編寫Controller

在引導類MySpringBootApplication同級包或者子級包中創(chuàng)建QuickStartController

package com.itheima.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class QuickStartController {
    
    @RequestMapping("/quick")
    @ResponseBody
    public String quick(){
        return "springboot 訪問成功!";
    }
    
}

2.1.5 測試

執(zhí)行SpringBoot起步類的主方法比吭,控制臺打印日志如下:

.   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.1.RELEASE)

2018-05-08 14:29:59.714  INFO 5672 --- [           main] com.itheima.MySpringBootApplication      : Starting MySpringBootApplication on DESKTOP-RRUNFUH with PID 5672 (C:\Users\muzimoo\IdeaProjects\IdeaTest\springboot_quick\target\classes started by muzimoo in C:\Users\muzimoo\IdeaProjects\IdeaTest)
... ... ...
o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-05-08 14:30:03.126  INFO 5672 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2018-05-08 14:30:03.196  INFO 5672 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2018-05-08 14:30:03.206  INFO 5672 --- [           main] com.itheima.MySpringBootApplication      : Started MySpringBootApplication in 4.252 seconds (JVM running for 5.583)

通過日志發(fā)現(xiàn),Tomcat started on port(s): 8080 (http) with context path ''

tomcat已經(jīng)起步姨涡,端口監(jiān)聽8080衩藤,web應用的虛擬工程名稱為空

打開瀏覽器訪問url地址為:http://localhost:8080/quick

2.2 快速入門解析

2.2.2 SpringBoot代碼解析

  • @SpringBootApplication:標注SpringBoot的啟動類,該注解具備多種功能(后面詳細剖析)
  • SpringApplication.run(MySpringBootApplication.class) 代表運行SpringBoot的啟動類涛漂,參數(shù)為SpringBoot啟動類的字節(jié)碼對象

2.2.3 SpringBoot工程熱部署

我們在開發(fā)中反復修改類赏表、頁面等資源检诗,每次修改后都是需要重新啟動才生效,這樣每次啟動都很麻煩瓢剿,浪費了大量的時間逢慌,我們可以在修改代碼后不重啟就能生效,在 pom.xml 中添加如下配置就可以實現(xiàn)這樣的功能间狂,我們稱之為熱部署攻泼。

<!--熱部署配置-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>

出現(xiàn)這種情況,并不是熱部署配置問題鉴象,其根本原因是因為Intellij IEDA默認情況下不會自動編譯忙菠,需要對IDEA進行自動編譯的設置File ->settings-->
image.png

然后應用+ok

然后 Shift+Ctrl+Alt+/,選擇Registry

-->
image.png

勾選上就可以了

idea快速創(chuàng)建SpringBoot 項目

三纺弊、SpringBoot原理分析

3.1 起步依賴原理分析

3.1.1 分析spring-boot-starter-parent

按住Ctrl點擊pom.xml中的spring-boot-starter-parent牛欢,跳轉(zhuǎn)到了spring-boot-starter-parent的pom.xml,xml配置如下(只摘抄了部分重點配置):俭尖、

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-dependencies</artifactId>
  <version>2.0.1.RELEASE</version>
  <relativePath>../../spring-boot-dependencies</relativePath>
</parent>

按住Ctrl點擊pom.xml中的spring-boot-starter-dependencies氢惋,跳轉(zhuǎn)到了spring-boot-starter-dependencies的pom.xml,xml配置如下(只摘抄了部分重點配置):

<properties>
    <activemq.version>5.15.3</activemq.version>
    <antlr2.version>2.7.7</antlr2.version>
    <appengine-sdk.version>1.9.63</appengine-sdk.version>
    <artemis.version>2.4.0</artemis.version>
    <aspectj.version>1.8.13</aspectj.version>
    <assertj.version>3.9.1</assertj.version>
    <atomikos.version>4.0.6</atomikos.version>
    <bitronix.version>2.1.4</bitronix.version>
    <build-helper-maven-plugin.version>3.0.0</build-helper-maven-plugin.version>
    <byte-buddy.version>1.7.11</byte-buddy.version>
    ... ... ...
</properties>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot</artifactId>
            <version>2.0.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-test</artifactId>
            <version>2.0.1.RELEASE</version>
        </dependency>
        ... ... ...
    </dependencies>
</dependencyManagement>
<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.jetbrains.kotlin</groupId>
                <artifactId>kotlin-maven-plugin</artifactId>
                <version>${kotlin.version}</version>
            </plugin>
            <plugin>
                <groupId>org.jooq</groupId>
                <artifactId>jooq-codegen-maven</artifactId>
                <version>${jooq.version}</version>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.0.1.RELEASE</version>
            </plugin>
            ... ... ...
        </plugins>
    </pluginManagement>
</build>

從上面的spring-boot-starter-dependencies的pom.xml中我們可以發(fā)現(xiàn)稽犁,一部分坐標的版本焰望、依賴管理、插件管理已經(jīng)定義好已亥,所以我們的SpringBoot工程繼承spring-boot-starter-parent后已經(jīng)具備版本鎖定等配置了熊赖。所以起步依賴的作用就是進行依賴的傳遞。

四虑椎、SpringBoot的配置文件

4.1 SpringBoot配置文件類型

4.1.1 SpringBoot配置文件類型和作用

SpringBoot是基于約定的震鹉,所以很多配置都有默認值,但如果想使用自己的配置替換默認配置的話捆姜,就可以使用application.properties或者application.yml(application.yaml)進行配置传趾。

SpringBoot默認會從Resources目錄下加載application.properties或application.yml(application.yaml)文件

其中,application.properties文件是鍵值對類型的文件泥技,之前一直在使用浆兰,所以此處不在對properties文件的格式進行闡述。除了properties文件外珊豹,SpringBoot還可以使用yml文件進行配置簸呈,下面對yml文件進行講解。

4.1.2 application.yml配置文件

4.1.2.1 yml配置文件簡介

YML文件格式是YAML (YAML Aint Markup Language)編寫的文件格式店茶,YAML是一種直觀的能夠被電腦識別的的數(shù)據(jù)數(shù)據(jù)序列化格式蜕便,并且容易被人類閱讀,容易和腳本語言交互的贩幻,可以被支持YAML庫的不同的編程語言程序?qū)虢蜗伲热纾?C/C++, Ruby, Python, Java, Perl, C#, PHP等两嘴。YML文件是以數(shù)據(jù)為核心的,比傳統(tǒng)的xml方式更加簡潔吃溅。

YML文件的擴展名可以使用.yml或者.yaml溶诞。
、#### 4.1.2.2 yml配置文件的語法

4.1.2.2.1 配置普通數(shù)據(jù)
  • 語法: key: value

  • 示例代碼:

  • name: haohao
    
  • 注意:value之前有一個空格

4.1.2.2.2 配置對象數(shù)據(jù)
  • 語法:

    key:

      key1: value1
    
      key2: value2
    

    或者:

    key: {key1: value1,key2: value2}

  • 示例代碼:

  • person:
      name: haohao
      age: 31
      addr: beijing
    
    #或者
    
    person: {name: haohao,age: 31,addr: beijing}
    
  • 注意:key1前面的空格個數(shù)不限定决侈,在yml語法中,相同縮進代表同一個級別

4.1.2.2.2 配置Map數(shù)據(jù)

同上面的對象寫法

4.1.2.2.3 配置數(shù)組(List喧务、Set)數(shù)據(jù)
  • 語法:

    key:

      - value1
    
      - value2
    

    或者:

    key: [value1,value2]

  • 示例代碼:

  • city:
      - beijing
      - tianjin
      - shanghai
      - chongqing
      
    #或者
    
    city: [beijing,tianjin,shanghai,chongqing]
    

集合中的元素是對象形式

  student:
    - name: zhangsan
      age: 18
      score: 100
    - name: lisi
      age: 28
      score: 88
    - name: wangwu
      age: 38
      score: 90
  • 注意:value1與之間的 - 之間存在一個空格

4.2 配置文件與配置類的屬性映射方式

4.2.1 使用注解@Value映射

我們可以通過@Value注解將配置文件中的值映射到一個Spring管理的Bean的字段上

例如:

application.properties配置如下:

person:
  name: zhangsan
  age: 18

或者赖歌,application.yml配置如下:

person:
  name: zhangsan
  age: 18

實體Bean代碼如下:

@Controller
public class QuickStartController {

    @Value("${person.name}")
    private String name;
    @Value("${person.age}")
    private Integer age;


    @RequestMapping("/quick")
    @ResponseBody
    public String quick(){
        return "springboot 訪問成功! name="+name+",age="+age;
    }

}

實體Bean代碼如下:

@Controller
@ConfigurationProperties(prefix = "person")
public class QuickStartController {

    private String name;
    private Integer age;

    @RequestMapping("/quick")
    @ResponseBody
    public String quick(){
        return "springboot 訪問成功! name="+name+",age="+age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

注意:使用@ConfigurationProperties方式可以進行配置文件與實體字段的自動映射,但需要字段必須提供set方法才可以功茴,而使用@Value注解修飾的字段不需要提供set方法

小技巧:@ConfigurationProperties配置執(zhí)行器以后庐冯,可以先寫對象的屬性,再進行配置坎穿,會有相應的提示展父。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市玲昧,隨后出現(xiàn)的幾起案子栖茉,更是在濱河造成了極大的恐慌,老刑警劉巖孵延,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吕漂,死亡現(xiàn)場離奇詭異,居然都是意外死亡尘应,警方通過查閱死者的電腦和手機惶凝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來犬钢,“玉大人苍鲜,你說我怎么就攤上這事$栌蹋” “怎么了混滔?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長箱舞。 經(jīng)常有香客問我遍坟,道長,這世上最難降的妖魔是什么晴股? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任愿伴,我火速辦了婚禮,結(jié)果婚禮上电湘,老公的妹妹穿的比我還像新娘隔节。我一直安慰自己鹅经,他們只是感情好,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布怎诫。 她就那樣靜靜地躺著瘾晃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪幻妓。 梳的紋絲不亂的頭發(fā)上蹦误,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音肉津,去河邊找鬼强胰。 笑死,一個胖子當著我的面吹牛妹沙,可吹牛的內(nèi)容都是我干的偶洋。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼距糖,長吁一口氣:“原來是場噩夢啊……” “哼玄窝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起悍引,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤恩脂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吗铐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體东亦,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年唬渗,在試婚紗的時候發(fā)現(xiàn)自己被綠了典阵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡镊逝,死狀恐怖壮啊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情撑蒜,我是刑警寧澤歹啼,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站座菠,受9級特大地震影響狸眼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜浴滴,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一拓萌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧升略,春花似錦微王、人聲如沸屡限。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钧大。三九已至,卻和暖如春罩旋,著一層夾襖步出監(jiān)牢的瞬間啊央,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工瘸恼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留劣挫,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓东帅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親球拦。 傳聞我的和親對象是個殘疾皇子靠闭,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容