摘要:創(chuàng)建工程將框架代碼包解壓后放到工作目錄。方便起見(jiàn),本教程使用為例。添加創(chuàng)建一個(gè),負(fù)責(zé)響應(yīng)相關(guān)的業(yè)務(wù)請(qǐng)求。添加標(biāo)注在中,對(duì)輸入?yún)?shù)進(jìn)行校驗(yàn)通常使用標(biāo)注。在本教程,我們將實(shí)現(xiàn)的增和查的工作。創(chuàng)建用戶用戶名重啟并提交創(chuàng)建請(qǐng)求。
環(huán)境準(zhǔn)備
系統(tǒng):MacOS
開(kāi)發(fā):IntelliJ IDEA
語(yǔ)言:Java8
其它:Mysql、Redis
腳手架代碼Spring提供了一個(gè)創(chuàng)建項(xiàng)目腳手架的官網(wǎng),在這里可以直接定制項(xiàng)目的框架代碼。例如:
注意:在Dependencies中,添加了Web依賴。
點(diǎn)擊【Generate Project】,即可下載項(xiàng)目框架代碼。
創(chuàng)建工程將框架代碼包解壓后放到工作目錄。打開(kāi)IDEA,點(diǎn)擊【File] -> 【Open】,打開(kāi)對(duì)應(yīng)目錄。
啟動(dòng)工程找到com.spring.demo.demo下的DemoApplication,右鍵點(diǎn)擊運(yùn)行后,console中即可顯示Spring啟動(dòng)的信息。
在傳統(tǒng)MVC架構(gòu)中,Controller負(fù)責(zé)接收Http請(qǐng)求并返回相應(yīng)的應(yīng)答,這個(gè)應(yīng)答可以是一個(gè)頁(yè)面,也可以是一個(gè)JSON對(duì)象。方便起見(jiàn),本教程使用RestfulAPI為例。
添加RestController創(chuàng)建一個(gè)UserController,負(fù)責(zé)響應(yīng)User相關(guān)的業(yè)務(wù)請(qǐng)求。對(duì)于純數(shù)據(jù)的API接口,使用@RestControll進(jìn)行標(biāo)注,這樣每一個(gè)API接口的返回值就會(huì)被轉(zhuǎn)化為JSON結(jié)構(gòu)的數(shù)據(jù)。
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"; } }
重啟應(yīng)用,在瀏覽器中請(qǐng)求http://localhost:8080/user,即可看到請(qǐng)求的返回內(nèi)容:UserA。
路徑參數(shù)對(duì)于帶路徑參數(shù)的請(qǐng)求,可以通過(guò)@PathVariable 標(biāo)注來(lái)獲取參數(shù)值。如:
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請(qǐng)求
對(duì)于POST請(qǐng)求,可以使用@PostMapping 來(lái)標(biāo)注方法,接收的JSON數(shù)據(jù)需要使用@RequestBody來(lái)標(biāo)注。
... @PostMapping("/user") public void create(@RequestBody UserCreateRequest user) { System.out.println(user.getName()); } ...
這里的UserCreateRequest,用來(lái)接收并轉(zhuǎn)換JSON數(shù)據(jù)。
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來(lái)進(jìn)行測(cè)試。
curl -XPOST "http://127.0.0.1:8080/user" -H "Content-Type: application/json" -d"{"name":"用戶A","gender":0}"參數(shù)校驗(yàn)
有時(shí)我們需要對(duì)傳入?yún)?shù)進(jìn)行非空或有效值的校驗(yàn),這個(gè)處理應(yīng)該在正式進(jìn)入controller前進(jìn)行。
1. 添加@Validated標(biāo)注在SpringMVC中,對(duì)輸入?yún)?shù)進(jìn)行校驗(yàn)通常使用@Validated標(biāo)注。
... @PostMapping("/user") public void create(@RequestBody @Validated UserCreateRequest user) { System.out.println(user.getName()); } ...2. 添加校驗(yàn)規(guī)則標(biāo)注@
在對(duì)應(yīng)的字段上,加上對(duì)應(yīng)的校驗(yàn)規(guī)則標(biāo)注。
package com.spring.demo.demo.dto; import javax.validation.constraints.NotNull; public class UserCreateRequest { @NotNull private String name; private boolean gender; // Getters & Setters ... }
添加后重啟服務(wù),發(fā)送不含name字段的POST請(qǐng)求,結(jié)果如下:
MVC框架中,Controller負(fù)責(zé)接收請(qǐng)求和相應(yīng),Service則負(fù)責(zé)具體的業(yè)務(wù)處理,即Model層。
Service在定義是需要使用@Service標(biāo)注,SpringBoot在啟動(dòng)中將會(huì)注冊(cè)該Service并在Controller通過(guò)DI來(lái)實(shí)例化并使用該Service。
一般來(lái)說(shuō),我們會(huì)創(chuàng)建一個(gè)Service的接口類和一個(gè)對(duì)應(yīng)的實(shí)現(xiàn)類。
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; } }
在調(diào)用時(shí),Controller會(huì)直接應(yīng)用接口類,并添加@Autowired標(biāo)簽。這里的調(diào)用原理,即是Sping最著名的DI(依賴注入)和IoC(控制反轉(zhuǎn))。
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()); } }
此時(shí)重啟Spring,并使用curl進(jìn)行請(qǐng)求,可以得到結(jié)果:
$ curl -XGET "http://127.0.0.1:8080/user/100" $ 用戶100Repository
Spring本身集成了Spring Data JPA,用來(lái)作為訪問(wèn)數(shù)據(jù)庫(kù)的ORM工具,它采用了Hibernate實(shí)現(xiàn)。在本教程,我們將實(shí)現(xiàn)User的增和查的工作。
添加依賴修改pom.xml,添加對(duì)mysql和jpa的支持。
...服務(wù)配置... mysql mysql-connector-java org.springframework.boot spring-boot-starter-data-jpa
修改/resources/application.properties,添加相關(guān)的設(shè)置。
... 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中是一個(gè)非常重要的概念,字面意思來(lái)講它就是一個(gè)倉(cāng)庫(kù)。它屏蔽了SQL和數(shù)據(jù)庫(kù)操作的細(xì)節(jié),使得業(yè)務(wù)代碼無(wú)需再考慮更細(xì)節(jié)的數(shù)據(jù)處理。它和Mybatis可以說(shuō)是兩個(gè)完全相反的流派。
Spring Data JPA中,默認(rèn)實(shí)現(xiàn)了Crud操作的Repository,可以直接繼承并使用這個(gè)框架進(jìn)行快速的CRUD實(shí)現(xiàn)。
package com.spring.demo.demo.repo.repository; import com.spring.demo.demo.repo.entity.User; ... @Repository public interface UserRepository extends CrudRepository{ }
對(duì)應(yīng)數(shù)據(jù)庫(kù)中的數(shù)據(jù)表,會(huì)有一個(gè)實(shí)體Entity來(lái)定義它的表結(jié)構(gòu)。
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調(diào)用中,即可簡(jiǎn)單的使用save方法來(lái)保存新的User數(shù)據(jù)。
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方法并創(chuàng)建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("創(chuàng)建用戶 ID=" + user.getId() + " 用戶名=" + user.getName()); } }
重啟Spring并提交創(chuàng)建請(qǐng)求。
$ curl -XPOST "http://127.0.0.1:8080/user" -H "Content-Type: application/json" -d"{"name":"用戶A","gender":0}"
可以看到,在console中有創(chuàng)建成功的提示信息。
Hibernate: insert into t_user (gender, name) values (?, ?)緩存創(chuàng)建用戶 ID=1 用戶名=用戶A
對(duì)于不常改變的數(shù)據(jù),常常需要進(jìn)行緩存以提高系統(tǒng)性能和增加系統(tǒng)吞吐量。對(duì)此,Spring Cache提供了緩存的基本實(shí)現(xiàn)。
添加依賴修改pom.xml,添加對(duì)cache的支持。
...服務(wù)配置... org.springframework.boot spring-boot-starter-cache true
修改/resources/application.properties,添加相關(guān)的設(shè)置。
... spring.cache.type=simple打開(kāi)開(kāi)關(guān)
需要在Application中,打開(kāi)Cache開(kāi)關(guān)。
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標(biāo)注
對(duì)于Cache內(nèi)容,需要添加一個(gè)key名來(lái)保存內(nèi)容。
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,發(fā)送GET請(qǐng)求后可以看到,只有第一次執(zhí)行了SQL操作,說(shuō)明緩存處理已經(jīng)完成。
$ 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的默認(rèn)Cache處理并不使用Redis,要使用Redis作為緩存應(yīng)用,需要添加Redis的框架支持。
添加依賴修改pom.xml,添加對(duì)cache的支持。
...服務(wù)配置... org.springframework.boot spring-boot-starter-data-redis
修改/resources/application.properties,添加相關(guān)的設(shè)置。
... spring.redis.host=127.0.0.1 spring.redis.password=123456 spring.redis.port=6379 spring.redis.jedis.pool.max-active=8序列化對(duì)象
由于要保存到redis中,保存的實(shí)體對(duì)象需要進(jìn)行序列化。
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,再試一遍上節(jié)的操作,仍然是一樣的結(jié)果,但緩存已經(jīng)換為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=?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/73818.html
摘要:結(jié)束語(yǔ)非常智能化,為開(kāi)發(fā)者提供大量的默認(rèn)配置細(xì)節(jié),因此在的幫助下可以快速完成項(xiàng)目的運(yùn)行,極簡(jiǎn)入門(mén)繼續(xù)看從零入門(mén)系列程序結(jié)構(gòu)設(shè)計(jì)說(shuō)明 環(huán)境準(zhǔn)備 java 開(kāi)發(fā)環(huán)境 JDK1.8 安裝 Maven 安裝,jar自動(dòng)依賴及包管理工具 IDE編輯器:IntelliJ IDEA 2019 說(shuō)明 本項(xiàng)目為從零入門(mén)示例,目標(biāo)為構(gòu)建一個(gè)書(shū)籍增刪改查管理頁(yè),力爭(zhēng)記錄一個(gè)無(wú)java基礎(chǔ)的程序員學(xué)習(xí)筆...
上篇文章和大家聊了 Spring Session 實(shí)現(xiàn) Session 共享的問(wèn)題,有的小伙伴看了后表示對(duì) Nginx 還是很懵,因此有了這篇文章,算是一個(gè) Nginx 掃盲入門(mén)吧! 基本介紹 Nginx 是一個(gè)高性能的 HTTP 和反向代理 web 服務(wù)器,同時(shí)也提供了 IMAP/POP3/SMTP 服務(wù)。 Nginx 是由伊戈?duì)枴べ愃饕驗(yàn)槎砹_斯訪問(wèn)量第二的 Rambler.ru 站點(diǎn)開(kāi)發(fā)...
摘要:應(yīng)用化極簡(jiǎn)教程陳光劍基于的企業(yè)級(jí)應(yīng)用開(kāi)發(fā)最佳實(shí)踐前面的章節(jié)中,我們都是在環(huán)境中開(kāi)發(fā)運(yùn)行測(cè)試應(yīng)用程序。關(guān)鍵字是分布式應(yīng)用微服務(wù)容器虛擬化。通常,在企業(yè)項(xiàng)目實(shí)踐中,會(huì)實(shí)現(xiàn)一套應(yīng)用部署發(fā)布的自動(dòng)化運(yùn)維平臺(tái)工具。 Spring Boot 應(yīng)用 Docker 化 《Spring Boot 2.0極簡(jiǎn)教程》(陳光劍)—— 基于 Gradle + Kotlin的企業(yè)級(jí)應(yīng)用開(kāi)發(fā)最佳實(shí)踐 前面的章節(jié)中,...
摘要:應(yīng)用化極簡(jiǎn)教程陳光劍基于的企業(yè)級(jí)應(yīng)用開(kāi)發(fā)最佳實(shí)踐前面的章節(jié)中,我們都是在環(huán)境中開(kāi)發(fā)運(yùn)行測(cè)試應(yīng)用程序。關(guān)鍵字是分布式應(yīng)用微服務(wù)容器虛擬化。通常,在企業(yè)項(xiàng)目實(shí)踐中,會(huì)實(shí)現(xiàn)一套應(yīng)用部署發(fā)布的自動(dòng)化運(yùn)維平臺(tái)工具。 Spring Boot 應(yīng)用 Docker 化 《Spring Boot 2.0極簡(jiǎn)教程》(陳光劍)—— 基于 Gradle + Kotlin的企業(yè)級(jí)應(yīng)用開(kāi)發(fā)最佳實(shí)踐 前面的章節(jié)中,...
閱讀 2161·2021-09-04 16:40
閱讀 1452·2021-08-13 15:07
閱讀 3605·2019-08-30 15:53
閱讀 3194·2019-08-30 13:11
閱讀 1069·2019-08-29 17:22
閱讀 1811·2019-08-29 12:47
閱讀 1469·2019-08-29 11:27
閱讀 2221·2019-08-26 18:42