1. 程式人生 > >自定義spring boot starter三部曲之二:實戰開發

自定義spring boot starter三部曲之二:實戰開發

本文是《自定義spring boot starter三部曲》的第二篇,上一篇中我們通過學習spring cloud的starter,對spring boot的starter有了初步瞭解,也設計好了實戰內容,今天就來一起實現;

三部曲文章連結

  1. 《自定義spring boot starter三部曲之一:準備工作》
  2. 《自定義spring boot starter三部曲之二:實戰開發》
  3. 《自定義spring boot starter三部曲之三:原始碼分析spring.factories載入過程》

本章內容概述

  1. 建立工程customizestarter;
  2. 建立模組customizeapi;
  3. 建立模組addservice;
  4. 建立模組minusservice;
  5. 建立模組customizeservicestarter;
  6. 構建工程customizestarter,並安裝到本地maven倉庫;
  7. 建立工程customizestartertestdemo;
  8. 構建工程customizestartertestdemo,得到jar包;
  9. 啟動customizestartertestdemo工程的jar包,並帶上一個啟動引數,驗證支援負數的減法服務;
  10. 啟動customizestartertestdemo工程的jar包,驗證不支援服務的減法服務;

原始碼下載

您也可以選擇直接從GitHub下載customizestarter和customizestartertestdemo這兩個工程的原始碼,地址和連結資訊如下表所示:

名稱 連結 備註
專案主頁 https://github.com/zq2599/blog_demos 該專案在GitHub上的主頁
git倉庫地址(https) https://github.com/zq2599/blog_demos.git 該專案原始碼的倉庫地址,https協議
git倉庫地址(ssh) [email protected]:zq2599/blog_demos.git 該專案原始碼的倉庫地址,ssh協議

這個git專案中有多個資料夾,本章原始碼分別在customizestarter和customizestartertestdemo這兩個資料夾下,如下圖紅框所示:
在這裡插入圖片描述

接下來開始開發吧;

建立工程customizestarter

  1. 建立一個名為customizestarter的maven工程,以spring-boot-starter-parent作為父工程,同時自身又是後續幾個模組的父工程,pom.xml內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.bolingcavalry</groupId>
    <artifactId>customizestarter</artifactId>
    <packaging>pom</packaging>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath/>
    </parent>

    <modules>
        <!--加法服務-->
        <module>addservice</module>
        <!--減法服務-->
        <module>minusservice</module>
        <!--介面和異常定義-->
        <module>customizeapi</module>
        <!--啟動器-->
        <module>customizeservicestarter</module>
    </modules>
</project>

建立模組customizeapi

  1. 在工程customizestarter下建立模組customizeapi,這是個java工程,裡面是加法和減法服務的介面,和一個業務異常的定義;
  2. customizeapi的pom.xml內容如下,很簡單,只有基本定義:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>customizestarter</artifactId>
        <groupId>com.bolingcavalry</groupId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>customizeapi</artifactId>
</project>
  1. 異常定義類:
package com.bolingcavalry.api.exception;

/**
 * @author wilzhao
 * @description 執行減法服務時丟擲的異常
 * @email [email protected]
 * @time 2018/10/13 14:20
 */
public class MinusException extends Exception{
    public MinusException(String message) {
        super(message);
    }
}
  1. 加法服務的介面類AddService:
package com.bolingcavalry.api.service;

/**
 * @author wilzhao
 * @description 加法服務對應的介面
 * @email [email protected]
 * @time 2018/10/13 10:07
 */
public interface AddService {
    /**
     * 普通加法
     * @param a
     * @param b
     * @return
     */
    int add(int a, int b);
}
  1. 減法服務定義類,注意減法API聲明瞭異常丟擲,因為如果已經配置了不支援負數的減法服務,那麼被減數如果小於減數就丟擲異常:
package com.bolingcavalry.api.service;

import com.bolingcavalry.api.exception.MinusException;

/**
 * @author wilzhao
 * @description 減法服務
 * @email [email protected]
 * @time 2018/10/13 12:07
 */
public interface MinusService {
    /**
     * 普通減法
     * @param minuend 減數
     * @param subtraction 被減數
     * @return 差
     */
    int minus(int minuend, int subtraction) throws MinusException;
}

建立模組addservice

  1. 在工程customizestarter下建立模組addservice,這是個java工程,裡面包含了加法相服務的實現,pom.xml內容如下,注意由於要實現加法介面,因此需要依賴模組customizeapi:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>customizestarter</artifactId>
        <groupId>com.bolingcavalry</groupId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../</relativePath>
    </parent>
    <artifactId>addservice</artifactId>
    <modelVersion>4.0.0</modelVersion>

    <dependencies>
        <dependency>
            <groupId>com.bolingcavalry</groupId>
            <artifactId>customizeapi</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
</project>
  1. 加法介面的實現類AddServiceImpl很簡單,如下:
package com.bolingcavalry.addservice.service.impl;

import com.bolingcavalry.api.service.AddService;

/**
 * @author wilzhao
 * @description 加法服務的實現
 * @email [email protected]
 * @time 2018/10/13 10:59
 */
public class AddServiceImpl implements AddService {
    public int add(int a, int b) {
        return a + b;
    }
}

建立模組minusservice

  1. 在工程customizestarter下建立模組minusservice,這是個java工程,裡面包含了減法相服務的實現,pom.xml內容如下,注意由於要實現減法介面,因此需要依賴模組customizeapi:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>customizestarter</artifactId>
        <groupId>com.bolingcavalry</groupId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>minusservice</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.bolingcavalry</groupId>
            <artifactId>customizeapi</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
</project>
  1. 一共有兩個減法介面的實現類,第一個不支援負數結果,如果被減數小於減數就丟擲異常MinusException:
package com.bolingcavalry.minusservice.service.impl;

import com.bolingcavalry.api.exception.MinusException;
import com.bolingcavalry.api.service.MinusService;

/**
 * @author wilzhao
 * @description 減法服務的實現,不支援負數
 * @email [email protected]
 * @time 2018/10/13 14:24
 */
public class MinusServiceNotSupportNegativeImpl implements MinusService {

    /**
     * 減法運算,不支援負數結果,如果被減數小於減數,就跑出MinusException
     * @param minuend 被減數
     * @param subtraction 減數
     * @return
     * @throws MinusException
     */
    public int minus(int minuend, int subtraction) throws MinusException {
        if(subtraction>minuend){
            throw new MinusException("not support negative!");
        }

        return minuend-subtraction;
    }
}
  1. 第二個減法介面的實現類支援負數返回:
package com.bolingcavalry.minusservice.service.impl;

import com.bolingcavalry.api.exception.MinusException;
import com.bolingcavalry.api.service.MinusService;

/**
 * @author wilzhao
 * @description 支援負數結果的減法服務
 * @email [email protected]
 * @time 2018/10/13 14:30
 */
public class MinusServiceSupportNegativeImpl implements MinusService {

    /**
     * 減法實現,支援負數
     * @param minuend 減數
     * @param subtraction 被減數
     * @return
     * @throws MinusException
     */
    public int minus(int minuend, int subtraction) throws MinusException {
        return minuend - subtraction;
    }
}

建立模組customizeservicestarter

  1. 在工程customizestarter下建立模組customizeservicestarter,這是個java工程,裡面需要依賴spring boot配置相關的庫,由於要在配置中例項化加法和減法服務的實現,因此customizeapi、addservice、minusservice這些模組都要在pom.xml中宣告依賴,如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>customizestarter</artifactId>
        <groupId>com.bolingcavalry</groupId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../</relativePath>
    </parent>
    <artifactId>customizeservicestarter</artifactId>
    <modelVersion>4.0.0</modelVersion>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
            <!--僅編譯時才需要-->
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.bolingcavalry</groupId>
            <artifactId>customizeapi</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>com.bolingcavalry</groupId>
            <artifactId>addservice</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>com.bolingcavalry</groupId>
            <artifactId>minusservice</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
</project>
  1. 建立配置類CustomizeConfiguration,注意getSupportMinusService和getNotSupportMinusService這兩個方法上的註解配置,如果環境變數com.bolingcavalry.supportnegative存在並且等於true,那麼getSupportMinusService方法就返回了MinusService介面的例項,如果當前環境沒有MinusService介面的例項,就由getNotSupportMinusService方法就返回一個,並且有會在控制檯列印建立了哪種實現:
package com.bolingcavalry.customizeservicestarter;

import com.bolingcavalry.addservice.service.impl.AddServiceImpl;
import com.bolingcavalry.api.service.AddService;
import com.bolingcavalry.api.service.MinusService;
import com.bolingcavalry.minusservice.service.impl.MinusServiceNotSupportNegativeImpl;
import com.bolingcavalry.minusservice.service.impl.MinusServiceSupportNegativeImpl;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author wilzhao
 * @description 一句話介紹
 * @email [email protected]
 * @time 2018/10/13 14:36
 */
@Configuration
public class CustomizeConfiguration {

    @Bean
    public AddService getAddService(){
        System.out.println("create addService");
        return new AddServiceImpl();
    }

    /**
     * 如果配置了com.bolingcavalry.supportnegative=true,
     * 就例項化MinusServiceSupportNegativeImpl
     * @return
     */
    @Bean
    @ConditionalOnProperty(prefix="com.bolingcavalry",name = "supportnegative", havingValue = "true")
    public MinusService getSupportMinusService(){
        System.out.println("create minusService support minus");
        return new MinusServiceSupportNegativeImpl();
    }

    /**
     * 如果沒有配置com.bolingcavalry.supportnegative=true,
     * 就不會例項化MinusServiceSupportNegativeImpl,
     * 這裡的條件是如果沒有MinusService型別的bean,就在此例項化一個
     * @return
     */
    @Bean
    @ConditionalOnMissingBean(MinusService.class)
    public MinusService getNotSupportMinusService(){
        System.out.println("create minusService not support minus");
        return new MinusServiceNotSupportNegativeImpl();
    }
}
  1. 在src\main\resources目錄下建立一個目錄META-INF,裡面建立一個檔案spring.factories,內容是如下,表示如果當前應用支援spring boot的自動配置,就會被spring boot框架例項化並註冊到spring容器內:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.bolingcavalry.customizeservicestarter.CustomizeConfiguration

構建工程customizestarter

  1. 到這裡customizestarter工程的編碼就結束了,在工程內pom.xml所在目錄(也就是customizestarter內的第一層目錄),執行以下命令可以編譯構建並安裝到本地maven倉庫:
mvn clean install -Dmaven.test.skip=true -U
  1. 如果編譯構建和安裝都成功了,可以看到類似如下輸出:
[INFO] Installing C:\temp\201810\07\customizestarter\customizeservicestarter\pom.xml to C:\Users\12167\.m2\repositor
y\com\bolingcavalry\customizeservicestarter\0.0.1-SNAPSHOT\customizeservicestarter-0.0.1-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] customizestarter ................................... SUCCESS [  0.748 s]
[INFO] customizeapi ....................................... SUCCESS [  3.266 s]
[INFO] addservice ......................................... SUCCESS [  0.427 s]
[INFO] minusservice ....................................... SUCCESS [  0.344 s]
[INFO] customizeservicestarter ............................ SUCCESS [  0.495 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.954 s
[INFO] Finished at: 2018-10-14T00:17:46+08:00
[INFO] Final Memory: 29M/221M
[INFO] ------------------------------------------------------------------------

現在starter已經準備好了,我們做一個spring boot的web應用來驗證一下;

建立工程customizestartertestdemo

  1. 工程customizestartertestdemo是個簡單的spring boot應用,pom.xml如下,可見並無特別之處,只是多了customizeservicestarter的依賴:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion
            
           

相關推薦

定義spring boot starter三部曲實戰開發

本文是《自定義spring boot starter三部曲》的第二篇,上一篇中我們通過學習spring cloud的starter,對spring boot的starter有了初步瞭解,也設計好了實戰內容,今天就來一起實現; 三部曲文章連結 《自定義spring boot

定義spring boot starter三部曲原始碼分析spring.factories載入過程

本文是《自定義spring boot starter三部曲》系列的終篇,前文中我們開發了一個starter並做了驗證,發現關鍵點在於spring.factories的自動載入能力,讓應用只要依賴starter的jar包即可,今天我們來分析Spring和Spring boot原始碼,瞭解s

定義spring boot starter三部曲之一準備工作

從本章開始,一起實戰一個自定義的spring boot starter,整個系列共三篇文章,內容如下: 準備:瞭解基本概念、規劃實戰內容; 實戰:開發自定義starter,並在demo工程中使用它; 深入:從spring和spring boot原始碼層面分析sta

定義spring-boot-starter-hbase

專案背景 程式碼 打包 使用方式 依賴 整合 專案背景 公司越來越多的專案採用spring-boot+hbase的查詢,由於公司的hbase版本為1.x的CDH版本,本身沒有spring-boot的starter,故寫出一個sprin

最詳細的定義Spring Boot Starter開發教程

1. 前言 隨著Spring的日漸臃腫,為了簡化配置、開箱即用、快速整合,Spring Boot 橫空出世。 目前已經成為 Java 目前最火熱的框架了。平常我們用Spring Boot開發web應用。Spring mvc 預設使用tomcat servlet容器, 因為Spring mvc元件集成了spri

kubernetes下的Nginx加Tomcat三部曲細說開發

本文是《kubernetes下的Nginx加Tomcat三部曲》的第二章,在《kubernetes下的Nginx加Tomcat三部曲之一:極速體驗》一文我們快速部署了Nginx和Tomcat,達到以下效果: 本文我會詳細說明在kubernetes部署上述網

Spring Boot2 系列教程(六)定義 Spring Boot 中的 starter

我們使用 Spring Boot,基本上都是沉醉在它 Stater 的方便之中。Starter 為我們帶來了眾多的自動化配置,有了這些自動化配置,我們可以不費吹灰之力就能搭建一個生產級開發環境,有的小夥伴會覺得這個 Starter 好神奇呀!其實 Starter 也都是 Spring + SpringMVC

手把手教你實現定義Spring BootStarter

### 引言 上篇文章[《天天用SpringBoot,它的自動裝配原理卻說不出來》](https://mp.weixin.qq.com/s/TnofWzuaH-WDcfYVfp-UoA)我們有說`springBoot`的自動裝配怎麼實現的(建議最好先看下篇文章,因為前後有關係),這篇文章的話我們就自己來實現一

我的第一個spring boot程序(spring boot 學習筆記

獲取json 了解 訪問 static 依賴 過程 public 獲取數據 gap 第一個spring boot程序 寫在前面:鑒於spring註解以及springMVC的配置有大量細節和知識點,在學習理解之後,我們將直接進入spring boot的學習,在後續學習中用到註

定義 spring boot 啟動圖案

首先去這個網站 傳送門,輸入想要的圖案,選擇自己喜歡的字型,會得到對於的圖案,copy 圖案。 如下圖: 圖案如下: _ __ _ __ __ U _____ u _ _ |"|/ / U /"\ u\ \ /"/u\| ___"|

Docker下的Spring Cloud三部曲細說Spring Cloud開發

本文是《Docker下的Spring Cloud三部曲》系列的第二篇,詳細講解上一篇例項中用到的eureka、provider、consumer等三個應用的開發過程; 環境資訊 回顧一下實戰環境,如下圖: 原始碼地址 上圖的eureka、

攜程 Apollo 配置中心 | 學習筆記(三) 定義Spring Boot專案通過配置中心啟動專案

一、前言二、專案搭建   2.1 建立Spring Boot專案    因為專案用的是Eureka作為服務註冊與發現,因此這裡我加入了Eureka Client的依賴pom.xml檔案 <dependency> <grou

spring4.1.8初始化原始碼學習三部曲setConfigLocations方法

本章是學習spring4.1.8初始化原始碼的第二篇,前一章《spring4.1.8初始化原始碼學習三部曲之一:AbstractApplicationContext構造方法》對AbstractApplicationContext的初始化做了分析,本章我們聚焦

maven構建docker映象三部曲編碼和構建映象

在《maven構建docker映象三部曲之一:準備環境》中,我們在vmware上準備好了ubuntu16虛擬機器,並且裝好了docker、jdk8、maven等必備工具,現在我們來開發一個java web工程,再用docker-maven-plugin外掛來

Docker下Java檔案上傳服務三部曲服務端開發

本章是《Docker下Java檔案上傳服務三部曲》的第二篇,上一章《Docker下Java檔案上傳服務三部曲之一:準備環境》我們把客戶端準備好了,Tomcat容器也部署好了,今天就來開發和部署檔案服務的後臺應用吧; 本章實戰內容概要 本章要建立三個w

elasticsearch實戰三部曲文件操作

本文是《elasticsearch實戰三部曲》系列的第二篇,上一篇文章我們動手熟悉了索引相關的基本操作,現在一起來熟悉文件相關的操作; 系列文章連結 《elasticsearch實戰三部曲之一:索引操作》; 《elasticsearch實戰三部曲之二:文件操作》;

實戰maven私有倉庫三部曲上傳到私有倉庫

在上一章《實戰maven私有倉庫三部曲之一:搭建和使用》我們搭建了maven私有倉庫,並體驗了私有倉庫快取jar包的能力,避免了局域網內開發人員去遠端中央倉庫下載的痛苦等待,本章我們再來體驗私有倉庫的另一個功能:儲存二方庫; 使用場景 mvndemos

Docker下dubbo開發三部曲本地環境搭建

在上一篇文章《Docker下dubbo開發,三部曲之一:極速體驗》中,我們快速體驗了dubbo服務的註冊、發現、呼叫,今天我們一起在本地製作一套這樣的環境,經過這次實戰,大家就可以根據實際需求對自己的環境量身定製了。 基礎架構 整個環境由四個容器組成,梳

Docker下實戰zabbix三部曲監控其他機器

在上一章《Docker下實戰zabbix三部曲之一:極速體驗》中,我們快速安裝了zabbix server,並登入管理頁面查看了zabbix server所在機器的監控資訊,但是在實際場景中,應該是對應用伺服器做監控,所以今天我們來實戰將應用伺服器的監控加入到zabbix server中。 全系列文章連結:

Spring Boot 2.X(十)定時任務

簡介 定時任務是後端開發中常見的需求,主要應用場景有定期資料報表、定時訊息通知、非同步的後臺業務邏輯處理、日誌分析處理、垃圾資料清理、定時更新快取等等。 Spring Boot 集成了一整套的定時任務工具,讓我們專注於完成邏輯,剩下的基礎排程工作將自動完成。 通用實現方式 實現方式 描述 jav