1.1 什么是Spring
Spring的核心是提供了一個容器(container),通常稱為Spring應(yīng)用上下文(Spring application context),它們會創(chuàng)建和管理應(yīng)用組件。這些組件也可以稱為bean,會在Spring應(yīng)用上下文中裝配在一起,從而形成一個完整的應(yīng)用程序。這就像磚塊、砂漿、木材、管道和電線組合在一起,形成一棟房子似的。
基于Java的配置類
@Configuration注解會告知Spring這是一個配置類,會為Spring應(yīng)用上下文提供bean。這個配置類的方法使用@Bean注解進行了標(biāo)注,表明這些方法所返回的對象會以bean的形式添加到Spring的應(yīng)用上下文中(默認(rèn)情況下,這些bean所對應(yīng)的bean ID與定義它們的方法名稱是相同的)。
1.2 初始化Spring應(yīng)用

典型的Maven或Gradle項目結(jié)構(gòu)
- mvnw和mvnw.cmd:這是Maven包裝器(wrapper)腳本。借助這些腳本,即便你的機器上沒有安裝Maven,也可以構(gòu)建項目。
- pom.xml:這是Maven構(gòu)建規(guī)范,隨后我們將會深入介紹該文件。
- TacoCloudApplication.java:這是Spring Boot主類,它會啟動該項目。隨后,我們會詳細介紹這個類。
- application.properties:這個文件起初是空的,但是它為我們提供了指定配置屬性的地方。在本章中,我們會稍微修改一下這個文件,但是我會將配置屬性的詳細闡述放到第5章。
- static:在這個文件夾下,你可以存放任意為瀏覽器提供服務(wù)的靜態(tài)內(nèi)容(圖片、樣式表、JavaScript等),該文件夾初始為空。
- templates:這個文件夾中存放用來渲染內(nèi)容到瀏覽器的模板文件。這個文件夾初始是空的,不過我們很快就會往里面添加Thymeleaf模板。
- TacoCloudApplicationTests.java:這是一個簡單的測試類,它能確保Spring應(yīng)用上下文可以成功加載。在開發(fā)應(yīng)用的過程中,我們會將更多的測試添加進來。
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication //SpringBoot應(yīng)用
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args); //運行應(yīng)用
}
}
這個main()方法會調(diào)用SpringApplication中靜態(tài)的run()方法,后者會真正執(zhí)行應(yīng)用的引導(dǎo)過程,也就是創(chuàng)建Spring的應(yīng)用上下文。在傳遞給run()的兩個參數(shù)中,一個是配置類,另一個是命令行參數(shù)。盡管傳遞給run()的配置類不一定要和引導(dǎo)類相同,但這是最便利和最典型的做法。
盡管在TacoCloudApplication中只有很少的代碼,但是它包含了很多的內(nèi)容。其中,最強大的一行代碼也是最短的。@SpringBootApplication注解明確表明這是一個Spring Boot應(yīng)用。但是,@SpringBootApplication遠比看上去更強大。
@SpringBootApplication是一個組合注解,它組合了3個其他的注解。
- @SpringBootConfiguration:將該類聲明為配置類。盡管這個類目前還沒有太多的配置,但是后續(xù)我們可以按需添加基于Java的Spring框架配置。這個注解實際上是@Configuration注解的特殊形式。
- @EnableAutoConfiguration:啟用Spring Boot的自動配置。我們隨后會介紹自動配置的更多功能。就現(xiàn)在來說,我們只需要知道這個注解會告訴Spring Boot自動配置它認(rèn)為我們會用到的組件。
- @ComponentScan:啟用組件掃描。這樣我們能夠通過像@Component、@Controller、@Service這樣的注解聲明其他類,Spring會自動發(fā)現(xiàn)它們并將它們注冊為Spring應(yīng)用上下文中的組件。
1.3 編寫Spring應(yīng)用
在剛開始的時候,比較合適的做法是為Taco Cloud應(yīng)用添加一個主頁。在添加主頁時,我們將會創(chuàng)建兩個代碼構(gòu)件:
- 一個控制器類,用來處理主頁相關(guān)的請求;
- 一個視圖模板,用來定義主頁看起來是什么樣子。
測試是非常重要的,所以我們還會編寫一個簡單的測試類來測試主頁。但是,要事優(yōu)先,我們需要先編寫控制器。
1.3.1 處理Web請求
Spring自帶了一個強大的Web框架,名為Spring MVC。Spring MVC的核心是控制器(controller)的理念。控制器是處理請求并以某種方式進行信息響應(yīng)的類。在面向瀏覽器的應(yīng)用中,控制器會填充可選的數(shù)據(jù)模型并將請求傳遞給一個視圖,以便于生成返回給瀏覽器的HTML。
在第2章中,我們將會學(xué)習(xí)更多關(guān)于Spring MVC的知識?,F(xiàn)在,我們會編寫一個簡單的控制器類以處理對根路徑(比如,“/”)的請求,并將這些請求轉(zhuǎn)發(fā)至主頁視圖,在這個過程中不會填充任何的模型數(shù)據(jù)。程序清單1.4展示了這個簡單的控制器類。
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller //控制器
public class HomeController {
@GetMapping("/") //處理對根路徑“/”的請求
public String home() {
return "home"; //返回視圖名
}
}
可以看到,這個類帶有@Controller。就其本身而言,@Controller并沒有做太多的事情。它的主要目的是讓組件掃描將這個類識別為一個組件。因為HomeController帶有@Controller,所以Spring的組件掃描功能會自動發(fā)現(xiàn)它,并創(chuàng)建一個HomeController實例作為Spring應(yīng)用上下文中的bean。
1.3.2 定義視圖
為了讓主頁盡可能簡單,除了歡迎用戶訪問站點之外,它不會做其他的任何事情。Taco Cloud主頁模板:
頁面路徑:templates/home.html
圖片路徑:static/images/TacoCloud.png
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Taco Cloud</title>
</head>
<body>
<h1>Welcome to...</h1>
<img th:src="@{/images/TacoCloud.png}"/>
</body>
</html>
1.3.4 構(gòu)建和運行應(yīng)用
頁面效果:
頁面效果
1.3.5 了解Spring Boot DevTools
顧名思義,DevTools為Spring開發(fā)人員提供了一些便利的開發(fā)期工具,其中包括:
- 代碼變更后應(yīng)用會自動重啟;
- 當(dāng)面向瀏覽器的資源(如模板、JavaScript、樣式表)等發(fā)生變化時,會自動刷新瀏覽器;
- 自動禁用模板緩存;
- 如果使用H2數(shù)據(jù)庫的話,內(nèi)置了H2控制臺。
作用:
- 應(yīng)用自動重啟
- 瀏覽器自動刷新和禁用模板緩存(解釋:但是,在開發(fā)期,緩存模板就不太好了。在應(yīng)用運行的時候,如果緩存模板,那么我們刷新瀏覽器就無法看到模板變更的效果了。即便我們對模板做了修改,在應(yīng)用重啟之前,緩存的模板依然會有效。)
- 內(nèi)置的H2控制臺
1.3.6 回顧一下
1.4 俯瞰Spring風(fēng)景線
要想了解Spring的整體狀況,只需查看完整版本的Spring Initializr Web表單上的那一堆復(fù)選框列表即可。它列出了100多個可選的依賴項,所以我不會在這里列出所有選項,也不會提供截圖,但我鼓勵你去看一看。同時,在這里我會簡單介紹一些重點的項目。
- 1.4.1 Spring核心框架
- 1.4.2 Spring Boot
- 1.4.3 Spring Data
盡管Spring核心框架提供了基本的數(shù)據(jù)持久化支持,但是Spring Data提供了非常令人驚嘆的功能:將應(yīng)用程序的數(shù)據(jù)repository定義為簡單的Java接口,在定義驅(qū)動存儲和檢索數(shù)據(jù)的方法時使用一種命名約定即可。此外,Spring Data能夠處理多種不同類型的數(shù)據(jù)庫,包括關(guān)系型數(shù)據(jù)庫(JPA)、文檔數(shù)據(jù)庫(Mongo)、圖數(shù)據(jù)庫(Neo4j)等。在第3章中,我們將使用Spring Data為Taco Cloud應(yīng)用程序創(chuàng)建repository。- 1.4.4 Spring Security
應(yīng)用程序的安全性一直是一個重要的話題,而且正在變得越來越重要。幸運的是,Spring有一個健壯的安全框架,名為Spring Security。Spring Security解決了應(yīng)用程序通用的安全性需求,包括身份驗證、授權(quán)和API安全性。SpringSecurity的范圍太大,在本書中無法得到充分的介紹,但是我們將在第4章和第11章中討論一些常見的使用場景.- 1.4.5 Spring Integration和Spring Batch
- 1.4.6 Spring Cloud

