摘要:創建工程將框架代碼包解壓后放到工作目錄。方便起見,本教程使用為例。添加創建一個,負責響應相關的業務請求。添加標注在中,對輸入參數進行校驗通常使用標注。在本教程,我們將實現的增和查的工作。創建用戶用戶名重啟并提交創建請求。
環境準備
系統:MacOS
開發:IntelliJ IDEA
語言:Java8
其它:Mysql、Redis
腳手架代碼Spring提供了一個創建項目腳手架的官網,在這里可以直接定制項目的框架代碼。例如:
注意:在Dependencies中,添加了Web依賴。
點擊【Generate Project】,即可下載項目框架代碼。
創建工程將框架代碼包解壓后放到工作目錄。打開IDEA,點擊【File] -> 【Open】,打開對應目錄。
啟動工程找到com.spring.demo.demo下的DemoApplication,右鍵點擊運行后,console中即可顯示Spring啟動的信息。
在傳統MVC架構中,Controller負責接收Http請求并返回相應的應答,這個應答可以是一個頁面,也可以是一個JSON對象。方便起見,本教程使用RestfulAPI為例。
添加RestController創建一個UserController,負責響應User相關的業務請求。對于純數據的API接口,使用@RestControll進行標注,這樣每一個API接口的返回值就會被轉化為JSON結構的數據。
package com.spring.demo.demo.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class UserController { @RequestMapping("/user") public String find() { return "UserA"; } }
重啟應用,在瀏覽器中請求http://localhost:8080/user,即可看到請求的返回內容:UserA。
路徑參數對于帶路徑參數的請求,可以通過@PathVariable 標注來獲取參數值。如:
package com.spring.demo.demo.controller; import org.springframework.web.bind.annotation.PathVariable; ... @RestController public class UserController { @RequestMapping("/user/{id}") public String find(@PathVariable int id) { return "用戶ID[" + id + "]"; } }POST請求
對于POST請求,可以使用@PostMapping 來標注方法,接收的JSON數據需要使用@RequestBody來標注。
... @PostMapping("/user") public void create(@RequestBody UserCreateRequest user) { System.out.println(user.getName()); } ...
這里的UserCreateRequest,用來接收并轉換JSON數據。
package com.spring.demo.demo.dto; public class UserCreateRequest { private String name; private boolean gender; public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isGender() { return gender; } public void setGender(boolean gender) { this.gender = gender; } }
在IDEA的Terminal中,使用curl來進行測試。
curl -XPOST "http://127.0.0.1:8080/user" -H "Content-Type: application/json" -d"{"name":"用戶A","gender":0}"參數校驗
有時我們需要對傳入參數進行非空或有效值的校驗,這個處理應該在正式進入controller前進行。
1. 添加@Validated標注在SpringMVC中,對輸入參數進行校驗通常使用@Validated標注。
... @PostMapping("/user") public void create(@RequestBody @Validated UserCreateRequest user) { System.out.println(user.getName()); } ...2. 添加校驗規則標注@
在對應的字段上,加上對應的校驗規則標注。
package com.spring.demo.demo.dto; import javax.validation.constraints.NotNull; public class UserCreateRequest { @NotNull private String name; private boolean gender; // Getters & Setters ... }
添加后重啟服務,發送不含name字段的POST請求,結果如下:
MVC框架中,Controller負責接收請求和相應,Service則負責具體的業務處理,即Model層。
Service在定義是需要使用@Service標注,SpringBoot在啟動中將會注冊該Service并在Controller通過DI來實例化并使用該Service。
一般來說,我們會創建一個Service的接口類和一個對應的實現類。
IUserService
package com.spring.demo.demo.service; public interface IUserService { public String findUser(int id); }
UserService
package com.spring.demo.demo.service; import org.springframework.stereotype.Service; @Service public class UserService implements IUserService { public String findUser(int id) { return "用戶" + id; } }
在調用時,Controller會直接應用接口類,并添加@Autowired標簽。這里的調用原理,即是Sping最著名的DI(依賴注入)和IoC(控制反轉)。
package com.spring.demo.demo.controller; import com.spring.demo.demo.dto.UserCreateRequest; ... @RestController public class UserController { @Autowired IUserService userService; @RequestMapping("/user/{id}") public String find(@PathVariable int id) { return userService.findUser(id); } @PostMapping("/user") public void create(@RequestBody @Validated UserCreateRequest user) { System.out.println(user.getName()); } }
此時重啟Spring,并使用curl進行請求,可以得到結果:
$ curl -XGET "http://127.0.0.1:8080/user/100" $ 用戶100Repository
Spring本身集成了Spring Data JPA,用來作為訪問數據庫的ORM工具,它采用了Hibernate實現。在本教程,我們將實現User的增和查的工作。
添加依賴修改pom.xml,添加對mysql和jpa的支持。
...服務配置... mysql mysql-connector-java org.springframework.boot spring-boot-starter-data-jpa
修改/resources/application.properties,添加相關的設置。
... spring.datasource.url=jdbc:mysql://localhost:3306/demo?useSSL=false spring.datasource.username=root spring.datasource.password=123456 ... spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect spring.jpa.show-sql=true添加Repository和Entity
Repository在DDD中是一個非常重要的概念,字面意思來講它就是一個倉庫。它屏蔽了SQL和數據庫操作的細節,使得業務代碼無需再考慮更細節的數據處理。它和Mybatis可以說是兩個完全相反的流派。
Spring Data JPA中,默認實現了Crud操作的Repository,可以直接繼承并使用這個框架進行快速的CRUD實現。
package com.spring.demo.demo.repo.repository; import com.spring.demo.demo.repo.entity.User; ... @Repository public interface UserRepository extends CrudRepository{ }
對應數據庫中的數據表,會有一個實體Entity來定義它的表結構。
package com.spring.demo.demo.repo.entity; import javax.persistence.*; @Entity @Table(name="t_user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String name; private Integer gender; // Getter & Setter ... }
在Service調用中,即可簡單的使用save方法來保存新的User數據。
package com.spring.demo.demo.service; import com.spring.demo.demo.repo.entity.User; ... @Service public class UserService implements IUserService { @Autowired UserRepository userRepo; public String findUser(int id) { return "用戶" + id; } public User createUser(User user) { return userRepo.save(user); } }
最后在Controller中,修改Service方法并創建User。
package com.spring.demo.demo.controller; import com.spring.demo.demo.dto.UserCreateRequest; ... @RestController public class UserController { @Autowired IUserService userService; @RequestMapping("/user/{id}") public String find(@PathVariable int id) { return userService.findUser(id); } @PostMapping("/user") public void create(@RequestBody @Validated UserCreateRequest userReq) { User user = new User(); user.setName(userReq.getName()); user.setGender(userReq.getGender()); user = userService.createUser(user); System.out.println("創建用戶 ID=" + user.getId() + " 用戶名=" + user.getName()); } }
重啟Spring并提交創建請求。
$ curl -XPOST "http://127.0.0.1:8080/user" -H "Content-Type: application/json" -d"{"name":"用戶A","gender":0}"
可以看到,在console中有創建成功的提示信息。
Hibernate: insert into t_user (gender, name) values (?, ?)緩存創建用戶 ID=1 用戶名=用戶A
對于不常改變的數據,常常需要進行緩存以提高系統性能和增加系統吞吐量。對此,Spring Cache提供了緩存的基本實現。
添加依賴修改pom.xml,添加對cache的支持。
...服務配置... org.springframework.boot spring-boot-starter-cache true
修改/resources/application.properties,添加相關的設置。
... spring.cache.type=simple打開開關
需要在Application中,打開Cache開關。
package com.spring.demo.demo; import org.springframework.boot.SpringApplication; ... @SpringBootApplication @EnableCaching public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }使用Cacheable標注
對于Cache內容,需要添加一個key名來保存內容。
package com.spring.demo.demo.service; import com.spring.demo.demo.repo.entity.User; ... @Service public class UserService implements IUserService { @Autowired UserRepository userRepo; @Cacheable(cacheNames = "user") public User findUser(Integer id) { System.out.println("取得用戶操作 ID=" + id); return userRepo.findById(id).get(); } public User createUser(User user) { return userRepo.save(user); } }
重啟Spring,發送GET請求后可以看到,只有第一次執行了SQL操作,說明緩存處理已經完成。
$ curl -XGET "http://127.0.0.1:8080/user/1" $ 用戶A $ 用戶A
> 取得用戶操作 ID=1= > Hibernate: select user0_.id as id1_0_0_, user0_.gender as gender2_0_0_, user0_.name as name3_0_0_ from t_user user0_ where user0_.id=?Redis
Spring的默認Cache處理并不使用Redis,要使用Redis作為緩存應用,需要添加Redis的框架支持。
添加依賴修改pom.xml,添加對cache的支持。
...服務配置... org.springframework.boot spring-boot-starter-data-redis
修改/resources/application.properties,添加相關的設置。
... spring.redis.host=127.0.0.1 spring.redis.password=123456 spring.redis.port=6379 spring.redis.jedis.pool.max-active=8序列化對象
由于要保存到redis中,保存的實體對象需要進行序列化。
package com.spring.demo.demo.repo.entity; import java.io.Serializable; ... @Entity @Table(name="t_user") public class User implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String name; private Integer gender; // Getter & Setter ... }
重啟Spring,再試一遍上節的操作,仍然是一樣的結果,但緩存已經換為redis。
$ curl -XGET "http://127.0.0.1:8080/user/1" $ 用戶A $ 用戶A
> 取得用戶操作 ID=1 > Hibernate: select user0_.id as id1_0_0_, user0_.gender as gender2_0_0_, user0_.name as name3_0_0_ from t_user user0_ where user0_.id=?
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/73818.html
摘要:結束語非常智能化,為開發者提供大量的默認配置細節,因此在的幫助下可以快速完成項目的運行,極簡入門繼續看從零入門系列程序結構設計說明 環境準備 java 開發環境 JDK1.8 安裝 Maven 安裝,jar自動依賴及包管理工具 IDE編輯器:IntelliJ IDEA 2019 說明 本項目為從零入門示例,目標為構建一個書籍增刪改查管理頁,力爭記錄一個無java基礎的程序員學習筆...
上篇文章和大家聊了 Spring Session 實現 Session 共享的問題,有的小伙伴看了后表示對 Nginx 還是很懵,因此有了這篇文章,算是一個 Nginx 掃盲入門吧! 基本介紹 Nginx 是一個高性能的 HTTP 和反向代理 web 服務器,同時也提供了 IMAP/POP3/SMTP 服務。 Nginx 是由伊戈爾·賽索耶夫為俄羅斯訪問量第二的 Rambler.ru 站點開發...
摘要:應用化極簡教程陳光劍基于的企業級應用開發最佳實踐前面的章節中,我們都是在環境中開發運行測試應用程序。關鍵字是分布式應用微服務容器虛擬化。通常,在企業項目實踐中,會實現一套應用部署發布的自動化運維平臺工具。 Spring Boot 應用 Docker 化 《Spring Boot 2.0極簡教程》(陳光劍)—— 基于 Gradle + Kotlin的企業級應用開發最佳實踐 前面的章節中,...
摘要:應用化極簡教程陳光劍基于的企業級應用開發最佳實踐前面的章節中,我們都是在環境中開發運行測試應用程序。關鍵字是分布式應用微服務容器虛擬化。通常,在企業項目實踐中,會實現一套應用部署發布的自動化運維平臺工具。 Spring Boot 應用 Docker 化 《Spring Boot 2.0極簡教程》(陳光劍)—— 基于 Gradle + Kotlin的企業級應用開發最佳實踐 前面的章節中,...
閱讀 2174·2021-09-04 16:40
閱讀 1474·2021-08-13 15:07
閱讀 3613·2019-08-30 15:53
閱讀 3205·2019-08-30 13:11
閱讀 1084·2019-08-29 17:22
閱讀 1822·2019-08-29 12:47
閱讀 1486·2019-08-29 11:27
閱讀 2237·2019-08-26 18:42