最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringCloud應(yīng)用骨架開發(fā)詳解

 更新時(shí)間:2020年09月17日 08:30:12   作者:最老程序員閆濤  
這篇文章主要介紹了SpringCloud應(yīng)用骨架開發(fā)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

我們每做一個(gè)新項(xiàng)目,通常都是從另一個(gè)項(xiàng)目把代碼拷貝過來,然后在其上做開發(fā)。但是這種模式的一個(gè)比較大的問題就是會(huì)有很多上個(gè)項(xiàng)目的遺留代碼。因此,開發(fā)一個(gè)公共的應(yīng)用骨架系統(tǒng),在開始其他新項(xiàng)目時(shí),從這個(gè)骨架系統(tǒng)開始開發(fā),是一個(gè)很好的選擇。

我們首先需要?jiǎng)?chuàng)建一個(gè)SpringBoot工程,我們可以使用:https://start.spring.io/

如下所所:

在這里插入圖片描述

上圖中比較關(guān)鍵的是從頁面右側(cè)“Add Dependencies”按鈕彈出的列表中選擇“Spring Web”。網(wǎng)站上的工具會(huì)生成一個(gè)基本的SpringBoot工程,并自動(dòng)將zip文件下載到本地。
將該文件解壓,以idea community版本打開(也可以使用商業(yè)版,但是該版本是收費(fèi)版,出于尊重知識(shí)產(chǎn)權(quán)的原因,使用免費(fèi)的社區(qū)版)。

我們首先將系統(tǒng)自帶的src/main/resources下面的application.properties文件刪除,添加application.yaml文件,添加如下內(nèi)容:

server:
 port: ${port:2208}
spring:
 application:
  name: first-service
logging:
 pattern:
  console: "%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"
  file: "%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"
 level:
  org.springframework.web: DEBUG
 file: app.log

下面我們以Person對象的增、刪、改、查操作為例,創(chuàng)建一個(gè)REST風(fēng)格的API。
我們首先在repository包中創(chuàng)建Person對象:

public class Person {
  private Long personId;
  private String firstName;
  private String lastName;
  private int age;
// getter and setters
//......
}

接下來我們來創(chuàng)建REST服務(wù)端,在controller包中創(chuàng)建DemoController類:

@RestController
@RequestMapping("/person")
public class DemoController {
  private List<Person> persons = new ArrayList<>();

  @GetMapping
  public List<Person> findAll() {
    return persons;
  }

  @GetMapping("/{personId}")
  public Person findById(@PathVariable("personId") Long personId,
              HttpServletRequest request) {
    String mode = request.getParameter("mode");
    System.out.println("mode=" + mode + "!");
    return persons.stream().filter(item -> item.getPersonId().equals(personId)).findFirst().get();
  }

  @PostMapping
  public Person add(@RequestBody Person p) {
    p.setPersonId((long)(persons.size()+1));
    persons.add(p);
    return p;
  }

  @DeleteMapping("/{personId}")
  public void delete(@PathVariable("personId") Long personId) {
    List<Person> ps = persons.stream().filter(item -> item.getPersonId().
        equals(personId)).collect(Collectors.toList());
    persons.removeAll(ps);
  }

  @PutMapping
  public void update(@RequestBody Person p) {
    Optional<Person> person = persons.stream().filter(item -> item.getPersonId().
        equals(p.getPersonId())).findFirst();
    person.ifPresent(po->persons.set(persons.indexOf(po), p));
  }
}

由于用到了Jdk8以后的一些特性,這里稍做一些解釋:

  • 第1行:代表其是一個(gè)REST風(fēng)格服務(wù)的類;
  • 第2行:規(guī)定所有/person開頭的請求,都由本類來進(jìn)行處理;
  • 第4行:使用泛型技術(shù)定義Person列表對象屬性;
  • 第6~9行:定義http://server/person請求,返回Json格式Person列表;
  • 第11行:定義http://server/person/101?mode=2形式的請求,首先定義路徑中包含的參數(shù)101為personId,分別在GetMapping和函數(shù)參數(shù)中用@RequestParam來定義,其次請求中的queryString使用函數(shù)形參中的第二個(gè)參數(shù)HttpServletRequest來獲取;
  • 第14、15行:獲取QueryString中的mode參數(shù);
  • 第16行:在過去,我們?nèi)缫雽ist對象進(jìn)行查找,需要自己遍歷List對象,在Jdk8之后,提供了Stream API,可以幫助我們更加高效的進(jìn)行查找。首先創(chuàng)建stream,這里其實(shí)還可以指定是否使用.parellel()并行技術(shù)來利用CPU的多核特性。然后在filter中定義查詢條件,該查詢條件是一個(gè)Lambda表達(dá)式,也是Jdk8之后引入的新特性,就是對列表中的每個(gè)元素item,首先獲取personId屬性,然后與personId參數(shù)進(jìn)行比較,取相等的記錄,由于相等的記錄可能存在多條,我們用findFirst來取第一條,其返回結(jié)果為Optional類型,Optional同樣是Jdk8之后引入的新特性,專門用于避免空指針異常。我們這里,我們非常確信其一定包括Person對象,所以通過.get函數(shù)獲取出Person對象,并返回;
  • 第19行:在REST風(fēng)格中,POST請求用于添加新對象;
  • 第20行:在缺省情況下,POST請求的內(nèi)容通過application/json傳遞,即客戶端需要將內(nèi)容轉(zhuǎn)換為Json格式,放入POST的請求體中,SpringBoot會(huì)自動(dòng)將請求體的Json內(nèi)容轉(zhuǎn)化為@RequestBody指定的值對象;
  • 第26行:在REST風(fēng)格中,DELETE請求用于刪除對象,即當(dāng)用戶發(fā)送的請求為DELETE /person/101 HTTP/1.0時(shí),代表刪除personId=101的對象;
  • 第27行:定義delete函數(shù),獲取請求路徑上的personId參數(shù);
  • 第28、29行:求出符合查詢條件的Person對象列表,同樣是先用成stream,在filter中定義查詢條件,最后通過collect函數(shù)將查詢結(jié)果轉(zhuǎn)換為列表;
  • 第30行:從persons列表中刪除符合條件記錄;
  • 第33行:在REST風(fēng)格中,用PUT請求來進(jìn)行對象更新;
  • 第34行:通過請求體中的Json字符串,由SpringBoot自動(dòng)創(chuàng)建Person值對象;
  • 第35、36行:查詢出符合條件的記錄,類型為Optional,在這里我們雖然可以使用if (ps.ifPresent()) {…},但是這和過去null的處理方式?jīng)]有什么區(qū)別,我們采用更Jdk8的形式,在ifPresent函數(shù)中提供了Lambda表達(dá)式,這義了對象更新邏輯;

我們下面需要對REST服務(wù)進(jìn)行測試,我們可以通過PostMan來進(jìn)行測試,但是在這里,我們將采用Swagger來進(jìn)行測試。這樣做主要好處是可以同時(shí)生成REST服務(wù)的文檔。
我們首先在項(xiàng)目根目錄下的pom.xml中添加如下內(nèi)容:

<!-- 開始:添加Swagger支持 -->
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger2</artifactId>
			<version>2.7.0</version>
		</dependency>
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger-ui</artifactId>
			<version>2.7.0</version>
		</dependency>
		<!-- 結(jié)束:添加Swagger支持 -->
		<!-- 開始:讀取maven pox.xml文件 -->
		<dependency>
			<groupId>org.apache.maven</groupId>
			<artifactId>maven-model</artifactId>
			<version>3.0</version>
		</dependency>
		<!-- 結(jié)束:讀取maven pox.xml文件 -->

同時(shí)給應(yīng)用類StpApplication添加如下標(biāo)注:

@EnableSwagger2
@SpringBootApplication
public class StpApplication {
	......

	@Bean
	public Docket api() throws IOException, XmlPullParserException {
		MavenXpp3Reader reader = new MavenXpp3Reader();
		Model model = reader.read(new FileReader("pom.xml"));
		ApiInfoBuilder builder = new ApiInfoBuilder()
				.title("智慧交通平臺(tái)")
				.description("智慧交通平臺(tái)API接口文檔")
				.version(model.getVersion())
				.contact(new Contact("最老程序員", "www.abc.com", "ua@"));
		return new Docket(DocumentationType.SWAGGER_2).select().
				apis(RequestHandlerSelectors.basePackage("com.zhuanjingkj.stp.demo.controller"))
						.paths(PathSelectors.any()).build()
						.apiInfo(builder.build());
	}
}

就是添加@EnableSwagger2標(biāo)注信息。在瀏覽器中輸入如下地址:http://localhost:2208/swagger-ui.html

會(huì)顯示如下圖所示頁面:

在這里插入圖片描述

我們可以點(diǎn)擊進(jìn)入對應(yīng)的接口,可以看到接口的調(diào)用方法,同時(shí)可以填寫真實(shí)的數(shù)據(jù),對接口進(jìn)行測試。

到此這篇關(guān)于SpringCloud應(yīng)用骨架開發(fā)詳解的文章就介紹到這了,更多相關(guān)SpringCloud應(yīng)用骨架 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring boot文件路徑映射配置代碼實(shí)例

    Spring boot文件路徑映射配置代碼實(shí)例

    這篇文章主要介紹了Spring boot文件路徑映射配置代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java實(shí)現(xiàn)解出世界最難九宮格問題

    Java實(shí)現(xiàn)解出世界最難九宮格問題

    這篇文章主要介紹了Java實(shí)現(xiàn)解出世界最難九宮格問題,芬蘭數(shù)學(xué)家因卡拉花費(fèi)3個(gè)月設(shè)計(jì)出了世界上迄今難度最大的數(shù)獨(dú)游戲,而且它只有一個(gè)答案,本文使用Java實(shí)現(xiàn)解出,需要的朋友可以參考下
    2015-01-01
  • spring?cloud?使用oauth2?問題匯總

    spring?cloud?使用oauth2?問題匯總

    這篇文章主要介紹了spring?cloud?使用oauth2?問題匯總,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • Java使用數(shù)組實(shí)現(xiàn)ArrayList的動(dòng)態(tài)擴(kuò)容的方法

    Java使用數(shù)組實(shí)現(xiàn)ArrayList的動(dòng)態(tài)擴(kuò)容的方法

    這篇文章主要介紹了Java使用數(shù)組實(shí)現(xiàn)ArrayList的動(dòng)態(tài)擴(kuò)容的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 關(guān)于HashSet與HashMap的區(qū)別及說明

    關(guān)于HashSet與HashMap的區(qū)別及說明

    這篇文章主要介紹了關(guān)于HashSet與HashMap的區(qū)別及說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java統(tǒng)計(jì)代碼的執(zhí)行時(shí)間的N種方法

    Java統(tǒng)計(jì)代碼的執(zhí)行時(shí)間的N種方法

    在日常開發(fā)中經(jīng)常需要測試一些代碼的執(zhí)行時(shí)間,但又不想使用向 JMH(Java?Microbenchmark Harness,Java 微基準(zhǔn)測試套件)這么重的測試框架,所以本文就匯總了一些 Java 中比較常用的執(zhí)行時(shí)間統(tǒng)計(jì)方法,總共包含以下 6 種,需要的朋友可以參考下
    2022-08-08
  • Java常量池詳解

    Java常量池詳解

    下面小編就為大家?guī)硪黄獪\談java常量池。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2021-09-09
  • Java圖像處理工具類

    Java圖像處理工具類

    這里給大家分享了一個(gè)java常用的圖像處理工具類,包含縮放圖像、切割圖像、圖像類型轉(zhuǎn)換、彩色轉(zhuǎn)黑白、文字水印、圖片水印等,有需要的小伙伴參考下。
    2015-02-02
  • java final本質(zhì)詳解

    java final本質(zhì)詳解

    在本篇文章里小編給大家分享的是關(guān)于java final本質(zhì)的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友們可以參考下。
    2019-09-09
  • Java靈活使用枚舉表示一組字符串的操作

    Java靈活使用枚舉表示一組字符串的操作

    這篇文章主要介紹了Java靈活使用枚舉表示一組字符串的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評論

思南县| 黄冈市| 渭南市| 渑池县| 靖州| 咸阳市| 上蔡县| 阿坝县| 霍邱县| 蓝田县| 奉新县| 乐至县| 商都县| 沛县| 丁青县| 土默特左旗| 永城市| 三原县| 南岸区| 蓬溪县| 南昌县| 东乌珠穆沁旗| 吉木乃县| 淮安市| 泰来县| 六盘水市| 昌宁县| 太和县| 宁夏| 进贤县| 淳化县| 溧水县| 水城县| 河西区| 隆德县| 陈巴尔虎旗| 卓尼县| 南陵县| 昭平县| 哈密市| 札达县|