欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

《Spring Boot實戰(zhàn)》之二:開發(fā)第一個應(yīng)用程序 - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網(wǎng)站建設(shè)-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設(shè)/小程序開發(fā)/軟件開發(fā)

知識

不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!

您當(dāng)前位置>首頁 » 新聞資訊 » 技術(shù)分享 >

《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ù)庫。我們使用InitializrWeb界面進(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)用程序的過程類似,可以選擇GradleMaven作為構(gòu)建工具。描述構(gòu)建說明文件的方法和描述非Spring Boot應(yīng)用程序的方法也相似。Spring BootGradleMaven提供了構(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 JPAJpaRepository接口:

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ò)展JpaRepositoryReadingListRepository直接繼承了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)案例查看更多