国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Spring筆記1——極簡(jiǎn)入門(mén)教程

ChristmasBoy / 1832人閱讀

摘要:創(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)的信息。

Controller

在傳統(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é)果如下:

Service

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" 
$ 用戶100
Repository

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的支持。

  ...
  
    ...
    
      mysql
      mysql-connector-java
    
    
      org.springframework.boot
      spring-boot-starter-data-jpa
    
  
服務(wù)配置

修改/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的支持。

  ...
  
    ...
    
      org.springframework.boot
      spring-boot-starter-cache
      true
    
  
服務(wù)配置

修改/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的支持。

  ...
  
    ...
    
      org.springframework.boot
      spring-boot-starter-data-redis
    
  
服務(wù)配置

修改/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

相關(guān)文章

  • 【從零入門(mén)系列-0】Spring Boot 之 Hello World

    摘要:結(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í)筆...

    icyfire 評(píng)論0 收藏0
  • Nginx 極簡(jiǎn)入門(mén)教程

    上篇文章和大家聊了 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ā)...

    _DangJin 評(píng)論0 收藏0
  • Spring Boot 應(yīng)用 Docker 化 《Spring Boot 2.0極簡(jiǎn)教程》(陳光劍)

    摘要:應(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é)中,...

    Donne 評(píng)論0 收藏0
  • Spring Boot 應(yīng)用 Docker 化 《Spring Boot 2.0極簡(jiǎn)教程》(陳光劍)

    摘要:應(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é)中,...

    rose 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<