自定義spring boot starter三部曲之二:實戰開發
本文是《自定義spring boot starter三部曲》的第二篇,上一篇中我們通過學習spring cloud的starter,對spring boot的starter有了初步瞭解,也設計好了實戰內容,今天就來一起實現;
三部曲文章連結
- 《自定義spring boot starter三部曲之一:準備工作》;
- 《自定義spring boot starter三部曲之二:實戰開發》;
- 《自定義spring boot starter三部曲之三:原始碼分析spring.factories載入過程》;
本章內容概述
- 建立工程customizestarter;
- 建立模組customizeapi;
- 建立模組addservice;
- 建立模組minusservice;
- 建立模組customizeservicestarter;
- 構建工程customizestarter,並安裝到本地maven倉庫;
- 建立工程customizestartertestdemo;
- 構建工程customizestartertestdemo,得到jar包;
- 啟動customizestartertestdemo工程的jar包,並帶上一個啟動引數,驗證支援負數的減法服務;
- 啟動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
- 建立一個名為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
- 在工程customizestarter下建立模組customizeapi,這是個java工程,裡面是加法和減法服務的介面,和一個業務異常的定義;
- 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>
- 異常定義類:
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);
}
}
- 加法服務的介面類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);
}
- 減法服務定義類,注意減法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
- 在工程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>
- 加法介面的實現類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
- 在工程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>
- 一共有兩個減法介面的實現類,第一個不支援負數結果,如果被減數小於減數就丟擲異常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;
}
}
- 第二個減法介面的實現類支援負數返回:
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
- 在工程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>
- 建立配置類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();
}
}
- 在src\main\resources目錄下建立一個目錄META-INF,裡面建立一個檔案spring.factories,內容是如下,表示如果當前應用支援spring boot的自動配置,就會被spring boot框架例項化並註冊到spring容器內:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.bolingcavalry.customizeservicestarter.CustomizeConfiguration
構建工程customizestarter
- 到這裡customizestarter工程的編碼就結束了,在工程內pom.xml所在目錄(也就是customizestarter內的第一層目錄),執行以下命令可以編譯構建並安裝到本地maven倉庫:
mvn clean install -Dmaven.test.skip=true -U
- 如果編譯構建和安裝都成功了,可以看到類似如下輸出:
[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
- 工程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 Boot的 Starter
### 引言
上篇文章[《天天用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