成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

開發 RESTful 應用程序,已經從困難到容易

網絡 通信技術
大家都知道,我們要用 Spring 創建一個RESTful 應用程序,是需要為框架做很多事情的,比如往項目的構建文件中添加各種庫依賴,還要自己寫各種配置文件,因為 Spring 雖然牛逼的提供了很多優秀的特性,但是我們還是需要配置告訴 Spring 該怎么做。

 [[413438]]

本文轉載自微信公眾號「七哥聊編程」,作者七哥 。轉載本文請聯系七哥聊編程公眾號。

大家好呀,我是七哥。

大家都知道,我們要用 Spring 創建一個RESTful 應用程序,是需要為框架做很多事情的,比如往項目的構建文件中添加各種庫依賴,還要自己寫各種配置文件,因為 Spring 雖然牛逼的提供了很多優秀的特性,但是我們還是需要配置告訴 Spring 該怎么做。

但是,現在都啥時代了,全人類都講究自動化、智能化了,我們程序員開發任務為啥就不能來點自動化、智能化呢?這不, Spring Boot 橫空出世了。它擁有的 起步依賴、自動配置 特性,讓我們拒絕那些繁瑣且千篇一律的配置,解放程序員的雙手,集中精力開發應用程序即可。

今天這篇文章的目標,就是帶大家用 Spring Boot 開發一個視頻觀看列表的應用程序,一起感受 Spring Boot 的強大。

1. 前言

我們今天要開發的這個視頻觀看列表應用程序,可以支持用戶查找觀看列表,輸入自己想看的視頻信息,刪除已經看過的視頻。

技術棧采用 Spring Boot 快速開發、Spring MVC 處理 Web 請求, Thymeleaf 來定義 Web 視圖,Spring Data JPA 來持久化觀看列表到數據化,數據庫使用 H2。

2. 初始化項目

創建 Spring Boot 項目的幾種方式我們之前已經講過了,本質都是使用的 Spring Initializr,選擇最合適的就好,但是要確保勾選了我們需要的依賴。

使用 IDEA 選擇 Initializr 創建項目:

創建完成后,就得到了如下圖的項目結構:

基本上 Spring Boot 項目初始化完成后的結構都是一樣的,你可能已經著急想開發應用程序了,但是在進入下一步寫代碼之前,我們還是停下腳步來具體看下項目里的這些東西都是干啥的,我覺得這是很重要的!搞清楚了大概的原理在開發的時候就不容易踩坑了,免得你在實際工作中不明所以,改這些文件也是糊里糊涂的,這樣容易出 bug 的~~

3. Spring Boot項目的結構

總體來說 Spring Boot 項目是遵循 Maven 或者 Gradle 的項目布局的,主要代碼放在 src/main/java 路徑下,配置文件放到 src/main/resources 路徑下,測試代碼放到 src/test/java 路徑下,如果有測試配置就放在 src/test/resources 路徑。

我們再來看下我們項目根目錄中還有不少文件:

  • build.gradle: Gradle 構建說明文件;
  • SpringRoad02Application.java:應用程序的啟動引導類,同時也是主要的 Spring 配置類;
  • application.properties:用于配置應用程序和 Spring Boot 的屬性;
  • SpringRoad02ApplicationTests.java:基本的集成測試類;

啟動引導Spring

SpringRoad02Application 它的作用是啟動引導和配置。

  1. //開啟組件掃描和自動配置 
  2. @SpringBootApplication  
  3. public class SpringRoad02Application { 
  4.  
  5.     public static void main(String[] args) { 
  6.         // 啟動引導應用程序 
  7.         SpringApplication.run(SpringRoad02Application.class, args);  
  8.     } 
  9.  

@SpringBootApplication 這個注解是如何開啟組件掃描和自動配置功能的呢?

這是因為 @SpringBootApplication 注解將三個有用的注解組合在了一起:

  • @SpringBootConfiguration:標明該類是一個基于 Java 代碼的 Spring 配置類;
  • @ComponentScan:啟用組件掃描,這樣項目中我們寫的控制器和其它服務類才會被 Spring 掃描注冊為應用程序上下文中的 Bean;
  • @EnableAutoConfiguration:這個注解最牛逼,就是它開啟了 Spring Boot 的黑魔法,讓我們不用寫 Spring 那些繁瑣的 xml 配置;

那要運行 Spring Boot 應用,除了傳統的 WAR 包部署,啟動類的 main 方法支持我們在命令行里把應用程序當成可執行的 JAR 包來運行。實際上就算我們一行代碼都不寫,這個項目已經是可運行的了,最簡單的構建運行方法就是 Gradle 的 bootRun 任務,你可以執行下面的命令感受一下:

  1. gradle bootRun 

啟動成功截圖:

測試Spring Boot應用程序

Initializr 還提供了一個測試類:SpringRoad02ApplicationTests ,可以基于它我們來為應用程序編寫測試。

  1. @SpringBootTest // 通過 Spring Boot 加載上下文 
  2. class SpringRoad02ApplicationTests { 
  3.  
  4.     @Test 
  5.     void contextLoads() { 
  6.     } 
  7.  

可以直接運行這個 contextLoads() 方法,不報錯就說明加載應用程序上下文是沒有問題的:

配置應用程序屬性

Initializr 生成的項目中有一個空的 application.properties 文件,這個文件其實是可選的,你可以刪掉,但是一般會保留,因為實際項目肯定都有很多的屬性配置,比如數據庫、mq、redis 等等。

我們可以給這個文件配置一個屬性 sever.port=8000 試試看:

加上后,我們在啟動程序,它內嵌的 Tomcat 監聽端口就從默認的 8080 改為了 8000。

神奇的地方在于,我們完全不用告訴 Spring Boot 去加載 application.properties 文件,只要它在根目錄存在就會自動被加載,Spring 和 應用程序就可以獲取其中配置的屬性。

4. 構建說明文件,起步依賴介紹

項目基本結構我們上面都已經介紹的差不多了,那接下里我們就來看看 Spring Boot 應用程序到底是如何構建的。比如 Spring Boot 為什么可以支持打 JAR 包部署?如果沒有 Spring Boot 我們要使用 Spring MVC 需要添加哪個依賴,應該用哪個版本的 Spring Data JPA?這些包放在一起的兼容性如何?

上面這些問題,都是我們在開發 Spring 應用程序會遇到的問題,一般情況下項目需要依賴包我們都是直接從其它項目拷貝過來,因為現有項目經過了測試,依賴jar包之前的兼容性經過了測試,出現問題的情況就比較小。不過就算這樣,這也是一項復雜繁瑣的工作。

好在 Spring Boot 的出現解放了我們奮戰在一線的程序員,因為它引入了起步依賴這個特性,簡而言之就是可以根據功能來引入對應的依賴包。

比如我們要開發一個 Web 應用,它使用 Thymeleaf,通過 Spring Data JPA 來持久化數據,那我們的構建文件就只需要寫上這些功能就可以了。

比如下面這樣,就是我通過 Spring Initializr 創建 Spring Boot 應用程序后 Gradle 構建文件里的包依賴說明:

  1. dependencies { 
  2.     implementation 'org.springframework.boot:spring-boot-starter-data-jpa' 
  3.     implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' 
  4.     implementation 'org.springframework.boot:spring-boot-starter-web' 
  5.     compileOnly 'org.projectlombok:lombok' 
  6.     runtimeOnly 'com.h2database:h2' 
  7.     annotationProcessor 'org.projectlombok:lombok' 
  8.     testImplementation 'org.springframework.boot:spring-boot-starter-test' 

可以看到,構建文件中沒有單獨的庫依賴,只需要添加對應的 起步依賴 就好了。這幾個起步依賴等價于加了一大把獨立的包,每個包的版本會根據 Spring Boot 的版本自動幫我們決定,都是經過大量的官方測試的,所以兼容性也可以放心。

如果你是一個小心謹慎的人,實在想看看自己用的相關包的版本,那么可以使用構建工具的命令查到你想看的:

  1. // gradle里使用的命令 
  2. gradle dependencies 
  3. // maven里使用的命令 
  4. mvn dependency:tree 

然后你就會得到一顆樹狀列表,查看每個起步依賴引入的那一大堆相關的包。

上面的這幾個起步依賴,包括 Web、Thymeleaf、JPA等,只不過是 Spring Boot 眾多起步依賴中的滄海一粟,它還提供了很多起步依賴,大家可以按需添加即可。

覆蓋起步依賴引入的傳遞依賴

假如我們現在要替換起步依賴引入的其中一個包的版本,要怎么做呢?當然一般我們不需要手動去替換,但是方法我們還是需要掌握的,可以用在某個包出現了嚴重的bug,或者刪除不需要使用的包給項目瘦身。

排除傳遞的依賴

gradle里面可以如下操作:

  1. // 排除掉 Jackson 
  2. implementation ('org.springframework.boot:spring-boot-starter-data-jpa') { 
  3.         exclude group'com.fasterxml.jackson.core' 

maven里可以使用元素來排除傳遞依賴。

  1. <dependency> 
  2.   <groupId>org.springframework.boot</groupId> 
  3.   <artifactId>spring-boot-starter-web</artifactId> 
  4.   <exclusions> 
  5.     <exclusion> 
  6.       <groupId>com.fasterxml.jsackson.core</groupId> 
  7.     </exclusion>   
  8.   </exclusions>   
  9. </dependency>   

 

 

 

替換傳遞的依賴

假如我們是需要將傳遞的 Jackson 包進行升級呢?這種情況一般多用在新版本的包升級了某個bug。

Maven 總是會用最近的依賴,也就是說重新添加就會覆蓋:

  1. <dependency> 
  2.   <groupId>com.fasterxml.jsackson.core</groupId> 
  3.   <artifactId>jackson-databind</artifactId> 
  4.   <version>2.12.3</version> 
  5. </dependency>     

 

Gradle 也是一樣的道理,不過如果你要替換的包版本比傳遞的包版本低 ,那么這塊有點坑需要注意下:Gradle 默認使用最新版本的包,所以就需要先排除起步依賴引入的包,在加入對應版本的包。

  1. implementation ('org.springframework.boot:spring-boot-starter-data-jpa') { 
  2.         exclude group'com.fasterxml.jackson.core' 
  3. }   
  4. implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.1' 

當然替換包的版本時候一定要謹慎,畢竟起步依賴的傳遞都是經過大量的測試的。

5. 使用自動配置,代碼開發

Spring Boot 采用的自動配置,可以節省我們手動寫諸如 web.xml 等配置文件,下面直接給大家展示下我們開發一個視頻觀看列表程序所需要的代碼。

數據庫實體對象;

  1. @Entity 
  2. @Data 
  3. public class Video { 
  4.     // 主鍵 
  5.     @Id  
  6.     // 值是自動生成的 
  7.     @GeneratedValue(strategy = GenerationType.AUTO)  
  8.     private Long id; 
  9.  
  10.     private String reader; 
  11.  
  12.     private String isbn; 
  13.  
  14.     private String title; 
  15.  
  16.     private String author; 
  17.  
  18.     private String description; 
  19.  
  20. }   

@Entity 注解表示這是一個JPA實體對象,@GeneratedValue 表示 id 字段的值是自動生成的。

數據訪問接口

  1. public interface ReadingListRepository extends JpaRepository<Video,Long> { 
  2.  
  3.     List<Video> findByReader(String reader); 
  4.    

你沒看錯,只需要繼承 JpaRepository 接口即可,這個接口內置了18個方法,我們也無需寫實現類, Spring Date 提供了非常智能的實現,應用程序啟動后,就會幫我們自動生成實現。

Web 接口定義

有了數據庫實體對象和持久化數據的接口,接下來我們就需要一個前端控制器,這塊使用的當然就是 SpringMVC 了。

  1. @Controller 
  2. public class ReadingListController { 
  3.  
  4.     @Autowired 
  5.     private ReadingListRepository readingListRepository; 
  6.  
  7.     @GetMapping(value = "/{viewer}"
  8.     public String readersVideos(@PathVariable("viewer") String viewer, Model model) { 
  9.         List<Video> videoList = readingListRepository.findByReader(viewer); 
  10.         if (videoList != null) { 
  11.             model.addAttribute("videos", videoList); 
  12.         } 
  13.         return "readingList"
  14.     } 
  15.  
  16.     @PostMapping(value = "/{viewer}"
  17.     public String addToReadingList(@PathVariable("viewer") String viewer, Video video) { 
  18.         video.setReader(viewer); 
  19.         readingListRepository.save(video); 
  20.         return "redirect:/{viewer}"
  21.     } 
  22. }   

代碼很簡單,就是定義了兩個接口,一個用于處理用戶的 GET 請求,獲取觀看視頻的列表,一個用于將用戶提交的視頻信息綁定到 Video 對象,然后通過數據訪問接口落庫。

由于 Spring Boot 提供的自動裝配特性,因此我們無需配置視圖解析器和模板引擎,就可以支持解析邏輯視圖名然后重定向到頁面了。

Thymeleaf模板

Spring Boot 項目我們的視圖模板文件需要放到 src/main/resources/templates 目錄下,文件名為:readingList.html 。

  1. <html> 
  2.     <head> 
  3.         <title>Reading List</title> 
  4.         <link rel="stylesheet" th:href="@{/style.css}"></link> 
  5.     </head> 
  6.     <body> 
  7.         <h2>Your Reading List</h2> 
  8.         <div th:unless="${#lists.isEmpty(videos)}"
  9.             <dl th:each="video : ${videos}"
  10.                 <dt class="bookHeadline"
  11.                     <span th:text="${video.title}">Title</span> by 
  12.                     <span th:text="${video.author}">Author</span> 
  13.                     (ISBN: <span th:text="${video.isbn}">ISBN</span>) 
  14.                 </dt> 
  15.                 <dd class="bookDescription"
  16.                     <span th:if="${video.description}" th:text="${video.description}">Description</span> 
  17.                     <span th:if="${video.description eq null}">No description available</span> 
  18.                 </dd> 
  19.             </dl> 
  20.         </div> 
  21.         <div th:if="${#lists.isEmpty(videos)}"
  22.             <p>You have no books in your book list</p> 
  23.         </div> 
  24.         <hr/> 
  25.         <h3>Add a video</h3> 
  26.         <form method="POST"
  27.             <label for="title">Title:</label> 
  28.             <input type="text" name="title" size="50"></input><br/> 
  29.             <label for="author">Author:</label> 
  30.             <input type="text" name="author" size="50"></input><br/> 
  31.             <label for="isbn">ISBN:</label> 
  32.             <input type="text" name="isbn" size="15"></input><br/> 
  33.             <label for="description">Description:</label><br/> 
  34.             <textarea name="description" cols="80" rows="5"></textarea><br/> 
  35.             <input type="submit"></input> 
  36.         </form> 
  37.     </body> 
  38. </html>   

 

 

 

 

然后我們還提供了一個簡單的樣式文件,這個名為 style.css 的樣式文件,我們需要放到 src/main/resources/static 靜態資源目錄下。

  1. body { 
  2.     background-color: #cccccc; 
  3.     font-family: arial,helvetica,sans-serif; 
  4. .bookHeadline { 
  5.     font-size: 12pt; 
  6.     font-weight: bold; 
  7. .bookDescription { 
  8.     font-size: 10pt; 
  9. label { 
  10.     font-weight: bold; 

至此代碼就寫完了,雖然它什么配置都沒有寫,不過這確實已經是一個完整的 Spring 應用程序了。你是不是已經迫不及待的想運行了?

6. 運行測試

Spring Boot 應用程序,可以選擇通過 Maven 或者 Gradle 來運行應用程序,比如文章前面我們使用的: gradle bootRun。

當然我們一般使用 IDEA 來開發,可以執行運行啟動類的 main 方法來運行。

然后我們通過瀏覽器來訪問:http://localhost:8000/sevenluo

可以嘗試添加一些視頻,然后就可以得到視頻列表了。

結尾

那今天我們通過一個簡單的視頻觀看列表應用程序,帶大家手把手開發了一個完整的 Spring Boot 應用程序。

開發全程我們是沒有任何配置的,之所以這么便利主要是用到了 Spring 4.0 引入的條件化配置新特性。

我們也可以在 Spring 里很方便的編寫自己的條件,只要實現 Condition 接口即可,今天就不多逼逼了,如果你對于 Spring Boot 如何通過條件化配置實現自動裝配感興趣,可以留言告訴我,我們安排一章來詳細介紹。

 

責任編輯:武曉燕 來源: 七哥聊編程
相關推薦

2009-05-11 20:22:41

2011-03-17 15:01:14

一次性試用品應用程序忠實用戶

2021-11-16 13:46:29

移動應用安全應用程序

2012-02-08 15:06:31

ibmdw

2022-09-19 00:37:13

SaaS云計算開發

2013-02-21 14:14:40

開發Tizen

2013-02-21 14:15:41

開發Tizen

2010-11-23 09:06:37

Web應用程序

2013-11-19 15:35:01

2012-09-24 09:31:28

應用移植性云計算云平臺應用程序

2009-09-24 17:21:17

加速Hibernate

2011-07-21 16:19:30

iOS Twitter

2011-05-31 13:34:22

應用開發iPad

2009-07-17 16:09:29

Swing桌面應用程序

2010-10-15 09:39:22

MeeGoQt

2013-08-08 09:48:10

Web

2011-02-22 10:23:43

2018-12-11 11:41:14

物聯網應用程序IOT

2011-03-31 13:15:18

BlackBerry

2011-12-06 10:10:59

云計算移動應用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩福利在线观看 | 亚洲精品中文字幕在线观看 | 天天天天操| 欧美99| 成人夜晚看av| 九九热最新地址 | 欧美h版 | 久久精品69 | 伊人焦久影院 | 日本免费在线观看视频 | 99久久婷婷国产精品综合 | 99免费精品视频 | 亚洲国产一区二区视频 | 一级毛片免费 | 性高朝久久久久久久3小时 av一区二区三区四区 | 一级一片在线观看 | 玖玖国产精品视频 | 亚洲国产二区 | 日韩伦理一区二区三区 | 一区二区三区四区在线 | 亚洲精品电影在线观看 | av在线电影网站 | 最新免费av网站 | 九九av| 婷婷丁香激情 | 亚洲欧美一区在线 | 中文字幕乱码一区二区三区 | 亚洲精品日韩在线观看 | 韩国欧洲一级毛片 | 日韩欧美久久精品 | 69av在线视频 | 亚洲在线免费 | 国产精品久久国产精品 | 亚洲人成在线播放 | 欧美11一13sex性hd | 国产精品久久久久aaaa樱花 | 国产精品免费观看 | 久久久精品一区 | 一区二区三区国产精品 | 中文字幕日韩欧美一区二区三区 | 精品伦精品一区二区三区视频 |