SpringBoot簡介:
1裙士、Spring的優(yōu)缺點分析:
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-->然后應用+ok
然后 Shift+Ctrl+Alt+/,選擇Registry
勾選上就可以了
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方法