知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!
《Spring Boot實戰(zhàn)》之二:開發(fā)第一個應(yīng)用程序
發(fā)表時間:2019-7-5
發(fā)布人:葵宇科技
瀏覽次數(shù):41
本章使用Spring Boot實現(xiàn)一個簡單的例子,主要包括兩個知識點:
- 使用Spring Boot的起步依賴
- 使用Spring Boot自動進(jìn)行Spring的配置
2.1 運用Spring Boot
下面將使用Spring Boot創(chuàng)建一個簡單的閱讀列表程序,用戶可以輸入想讀的 圖書信息,查看列表,刪除已經(jīng)讀過的書。
首先,使用Spring Boot初始化項目,從技術(shù)角度來看,我們要用Spring MVC來處理Web請求,用Thymeleaf來定義Web視圖,用Spring Data JPA來把閱讀列表持久化到數(shù)據(jù)庫里,這里先用嵌入式的H2數(shù)據(jù)庫。我們使用Initializr的Web界面進(jìn)行初始化,在添加依賴的地方添加Web、Thymeleaf和JPA。還要添加H2,以在開發(fā)應(yīng)用程序時使用內(nèi)嵌式數(shù)據(jù)庫。
初始化后的文件結(jié)構(gòu):
2.1.1 ReadListApplication.java
首先看ReadListApplication.java,ReadListApplication在Spring Boot應(yīng)用程序里有兩個作用:配置和啟動引導(dǎo)。首先, 這是主要的Spring配置類。雖然Spring Boot的自動配置免除了很多Spring配置,但你還需要進(jìn)行 少量配置來啟用自動配置。@SpringBootApplication開啟了Spring的組件掃描和Spring Boot的自動配置功能。實際 上,@SpringBootApplication將三個有用的注解組合在了一起。
- Spring的@Configuration:標(biāo)明該類使用Spring基于Java的配置。
- Spring的@ComponentScan:啟用組件掃描,這樣你寫的Web控制器類和其他組件才能被 自動發(fā)現(xiàn)并注冊為Spring應(yīng)用程序上下文里的Bean。本章稍后會寫一個簡單的Spring MVC 控制器,使用@Controller進(jìn)行注解,這樣組件掃描才能找到它。
- Spring Boot 的 @EnableAutoConfiguration :這個注解也可以稱為 @Abracadabra,就是這一行配置開啟了Spring Boot自動配置的魔力,讓你不用再寫成篇的配置了。
如前所述,ReadListApplication還有一個作用是啟動引導(dǎo),運行Spring Boot應(yīng)用程序有兩種方式:一是通過傳統(tǒng)的WAR包形式;二是通過可執(zhí)行jar包的方式。這里向SpringApplication.run()傳遞了一個ReadingListApplication類的引用,還有命令行參數(shù),通過這些東西啟動應(yīng)用程序。
package com.yuan.readlist;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication //開啟組件掃描和自動配置
public class ReadlistApplication {
public static void main(String[] args) {
SpringApplication.run(ReadlistApplication.class, args); //負(fù)責(zé)啟動引導(dǎo)應(yīng)用程序
}
}
2.1.2 ReadlistApplicationTests.java
ReadingListApplicationTests不僅提供了一個用于測試Spring Boot項目的框架,它還是一個例子,告訴你如何為Spring Boot應(yīng)用程序編寫測試。
contextLoads()這個空方法足以證明應(yīng)用程序上下文的加載沒有問題,如果ReadingListApplication里定義的配置是好的,就能通過測試。如果有問題,測試就會失敗。
當(dāng)然,現(xiàn)在這只是一個新的應(yīng)用程序,你還會添加自己的測試。但contextLoads()方法是個良好的開端,此刻可以驗證應(yīng)用程序提供的各種功能。第4章會更詳細(xì)地討論如何測試Spring Boot應(yīng)用程序。
package com.yuan.readlist;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class ReadlistApplicationTests {
@Test
public void contextLoads() {
}
}
2.1.3 application.properties
Initializr為你生成的application.properties文件是一個空文件,該文件可以用來調(diào)整Spring Boot的自動配置。
要注意的是,你完全不用告訴Spring Boot為你加載application.properties,只要它存在就會被加載,Spring和應(yīng)用程序代碼都能獲取其中的屬性,當(dāng)然如果它不存在也完全沒有問題,Spring Boot會使用其默認(rèn)配置。
2.1.4 運行項目
構(gòu)建一個Spring Boot應(yīng)用程序和構(gòu)建其他Java應(yīng)用程序的過程類似,可以選擇Gradle或Maven作為構(gòu)建工具。描述構(gòu)建說明文件的方法和描述非Spring Boot應(yīng)用程序的方法也相似。Spring Boot為Gradle和Maven提供了構(gòu)建插件,以便輔助構(gòu)建Spring Boot項目。
將項目導(dǎo)入到MyEclipse中,執(zhí)行ReadlistApplication的main方法,即可運行項目,然后瀏覽器訪問127.0.0.1:8080,由于還沒有寫控制器類,會打開一個404的錯誤頁面。
2.2 使用起步依賴
指定基于功能的依賴
通過使用Spring Boot的起步依賴,可以使我們不用指定具體的版本號,甚至不需要指定具體使用的依賴。比如我們前面在引入依賴時,我們只是在Initializr里添加了Web、Thymeleaf、JPA和H2,而通過傳遞依賴,它們聲明的依賴也會被傳遞依賴進(jìn)來,添加這四個依賴就等價于將相關(guān)的庫都添加了進(jìn)來。在《Spring Boot實戰(zhàn)》附錄B羅列出了全部起步依賴,并簡要描述了一下它們向項目構(gòu)建引入了什么。
覆蓋起步依賴引入的傳遞依賴
起步依賴和你項目里的其他依賴沒什么區(qū)別。也就是說,你可以通過構(gòu)建工具中的功能,選擇性地覆蓋它們引入的傳遞依賴的版本號,排除傳遞依賴,當(dāng)然還可以為那些Spring Boot起步依賴沒有涵蓋的庫指定依賴。在Maven里,可以用元素來排除傳遞依賴。
Maven總是會用最近的依賴,也就是說,如果你在項目里想要覆蓋Spring Boot引入的傳遞依賴,可以直接在在項目的構(gòu)建說明文件里增加的這個依賴。
(關(guān)于起步依賴更多詳細(xì)內(nèi)容,參考《Spring Boot實戰(zhàn)》2.2節(jié)使用起步依賴。)
2.3 使用自動配置
簡每當(dāng)應(yīng)用程序啟動的時候,Spring Boot檢測ClassPath中包含的包,并對包含的包做一個基本的配置。比如Spring Security是不是在Classpath里?如果是,則進(jìn)行一個非?;镜?/span>Web安全設(shè)置。
每當(dāng)應(yīng)用程序啟動的時候,Spring Boot的自動配置都要做將近200個這樣的決定,涵蓋安全、 集成、持久化、Web開發(fā)等諸多方面。所有這些自動配置就是為了盡量不讓你自己寫配置,從而更多的專注于程序的功能。
下面我們繼續(xù)ReadList的功能實現(xiàn):
- 定義領(lǐng)域模型
讀者閱讀列表上的書是本例的核心領(lǐng)域概念,我們定義一個實體類Book來表示這個概念。
@Entity注解表明它是一個JPA實體,id屬性加了@Id和@GeneratedValue注解,說明這個字段是實體的唯一標(biāo)識,并且這個字段的值是自動生成的。
package com.yuan.readlist;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String reader;
private String isbn;
private String title;
private String author;
private String description;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getReader() {
return reader;
}
public void setReader(String reader) {
this.reader = reader;
}
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
- 定義倉庫接口
用于把Book對象持久化到數(shù)據(jù)庫的倉庫了。因為用了Spring Data JPA,所以我們要做的就是簡單地定義一個接口,擴(kuò)展一下Spring Data JPA的JpaRepository接口:
package com.yuan.readlist;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ReadingListRepository extends JpaRepository<Book, Long> {
List<Book> findByReader(String reader);
}
通過擴(kuò)展JpaRepository,ReadingListRepository直接繼承了18個執(zhí)行常用持久化操作的方法。JpaRepository是個泛型接口,有兩個參數(shù):倉庫操作的領(lǐng)域?qū)ο箢愋?#xff0c;及其ID屬性的類型。此外,我還增加了一個findByReader()方法,可以根據(jù)讀者的用戶名來查找閱讀列表。 如果你好奇誰來實現(xiàn)這個ReadingListRepository及其繼承的18個方法,請不用擔(dān)心,Spring Data提供了很神奇的魔法,只需定義倉庫接口,在應(yīng)用程序啟動后,該接口在運行時會自動實現(xiàn)。
- 創(chuàng)建控制器
我們創(chuàng)建Spring MVC控制器來處理HTTP請求。ReadingListController使用了@Controller注解,這樣組件掃描會自動將其注冊為 Spring應(yīng)用程序上下文里的一個Bean。它還用了@RequestMapping注解,將其中所有的處理器 方法都映射到了“/”這個URL路徑上。
package com.yuan.readlist;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.List;
@Controller
@RequestMapping("/")
public class ReadingListController {
private ReadingListRepository readingListRepository;
@Autowired
public ReadingListController(ReadingListRepository readingListRepository) {
this.readingListRepository = readingListRepository;
}
@RequestMapping(value = "/{reader}", method = RequestMethod.GET)
public String readersBooks(@PathVariable("reader") String reader,
Model model) {
List<Book> readingList = readingListRepository.findByReader(reader);
if (readingList != null) {
model.addAttribute("books", readingList);
}
return "readingList";
}
@RequestMapping(value = "/{reader}", method = RequestMethod.POST)
public String addToReadingList(@PathVariable("reader") String reader,
Book book) {
book.setReader(reader);
readingListRepository.save(book);
return "redirect:/{reader}";
}
}
該控制器有兩個方法。
readersBooks():處理/{reader}上的HTTP GET請求,根據(jù)路徑里指定的讀者,從(通過控制器的構(gòu)造器注入的)倉庫獲取Book列表。隨后將這個列表塞入模型,用的鍵是books,最后返回readingList作為呈現(xiàn)模型的視圖邏輯名稱。
addToReadingList():處理/{reader}上的HTTP POST請求,將請求正文里的數(shù)據(jù)綁定到一個Book對象上。該方法把Book對象的reader屬性設(shè)置為讀者的姓名,隨后通過倉庫的save()方法保存修改后的Book對象,最后重定向到/{reader}(控制器中的另一個方法會處理該請求)。
- 創(chuàng)建WEB界面
readersBooks()方法最后返回readingList作為邏輯視圖名,為此必須創(chuàng)建該視圖。因為在項目開始之初就決定要用Thymeleaf來定義應(yīng)用程序的視圖,所以接下來就在src/main/resources/templates里創(chuàng)建一個名為readingList.html的文件:
<html>
<head>
<title>Reading List</title>
<link rel="stylesheet" th:href="@{/style.css}"></link>
</head>
<body
<h2>Your Reading List</h2>
<div th:unless="${#lists.isEmpty(books)}">
<dl th:each="book : ${books}">
<dt class="bookHeadline">
<span th:text="${book.title}">Title</span> by <span
th:text="${book.author}">Author</span> (ISBN: <span
th:text="${book.isbn}">ISBN</span>)
</dt>
<dd class="bookDescription">
<span th:if="${book.description}" th:text="${book.description}">Description</span>
<span th:if="${book.description eq null}"> No description
available</span>
</dd>
</dl>
</div>
<div th:if="${#lists.isEmpty(books)}">
<p>You have no books in your book list</p>
</div>
<hr />
<h3>Add a book</h3>
<form method="POST">
<label for="title">Title:</label> <input type="text" name="title"
size="50"></input><br /> <label for="author">Author:</label> <input
type="text" name="author" size="50"></input><br /> <label for="isbn">ISBN:</label>
<input type="text" name="isbn" size="15"></input><br /> <label
for="description">Description:</label><br />
<textarea name="description" cols="80" rows="5">
</textarea>
<br /> <input type="submit"></input>
</form>
</body>
</html>
添加名為style.css的樣式文件,該文件位于src/main/resources/static目錄:
body {
background-color: #cccccc;
font-family: arial,helvetica,sans-serif;
}
.bookHeadline {
font-size: 12pt;
font-weight: bold;
}
.bookDescription {
font-size: 10pt;
}
label {
font-weight: bold;
}
- 運行程序
到目前為止,我們就已經(jīng)完成了一個完整的Spring WEB程序,可見我們并沒有進(jìn)行什么配置,所有的配置都是Spring Boot自動完成的。
下面我們來運行這個WEB程序,在MyEclipse中右鍵,Run as Java Application,然后瀏覽器訪問127.0.0.1:8080/name即可打開網(wǎng)頁,可提交查詢表單。
關(guān)于Spring Boot自動配置更多內(nèi)容,及其如何實現(xiàn)自動配置功能,參見《Spring Boot實戰(zhàn)》2.3.3節(jié)內(nèi)容。
2.4 總結(jié)
通過Spring Boot的起步依賴和自動配置,你可以更加快速、便捷地開發(fā)Spring應(yīng)用程序。在下一章,我們將會看到如何覆蓋Spring Boot自動配置,借此達(dá)成應(yīng)用程序的一些特殊要求,還有如何運用類似的技術(shù)來配置自己的應(yīng)用程序組件。
相關(guān)案例查看更多
相關(guān)閱讀
- 花農(nóng)小程序
- 小程序用戶登錄
- 小程序技術(shù)
- 網(wǎng)絡(luò)公司
- 網(wǎng)站優(yōu)化
- 云南做網(wǎng)站
- .net網(wǎng)站
- 小程序定制開發(fā)
- 云南省建設(shè)廳網(wǎng)站
- 汽車報廢回收軟件
- 云南網(wǎng)站建設(shè)外包
- 云南小程序定制
- 小程序生成海報
- 專業(yè)網(wǎng)站建設(shè)公司
- 云南網(wǎng)站建設(shè)哪家好
- 云南網(wǎng)站建設(shè)百度
- 汽車拆解管理系統(tǒng)
- 智慧農(nóng)貿(mào)市場
- 云南網(wǎng)站建設(shè)哪家強(qiáng)
- 網(wǎng)站建設(shè)費用
- 云南小程序制作
- 小程序開發(fā)排名前十名
- 政府網(wǎng)站建設(shè)服務(wù)
- 小程序開發(fā)平臺前十名
- web開發(fā)技術(shù)
- 商標(biāo)
- web學(xué)習(xí)路線
- 云南網(wǎng)站建設(shè)選
- 網(wǎng)站建設(shè)公司網(wǎng)站
- 云南小程序開發(fā)課程