自定義一個springboot starter

来源:https://www.cnblogs.com/minqiliang/archive/2023/05/21/17419308.html
-Advertisement-
Play Games

## 1.自定義starter的作用 在我們的日常開發工作中,經常會有一些獨立於業務之外的配置模塊,比如阿裡雲oss存儲的時候,我們需要一個工具類進行文件上傳。我們經常將其放到一個特定的包下,然後如果另一個工程需要復用這塊功能的時候,需要將代碼硬拷貝到另一個工程,重新集成一遍,這樣會非常麻煩。如果我 ...


1.自定義starter的作用

在我們的日常開發工作中,經常會有一些獨立於業務之外的配置模塊,比如阿裡雲oss存儲的時候,我們需要一個工具類進行文件上傳。我們經常將其放到一個特定的包下,然後如果另一個工程需要復用這塊功能的時候,需要將代碼硬拷貝到另一個工程,重新集成一遍,這樣會非常麻煩。如果我們將這些可獨立於業務代碼之外的功配置模塊封裝成一個個starter,復用的時候只需要在 maven pom 中引用依賴即可,讓 SpringBoot 為我們完成自動裝配,提高開發效率。

2.自定義starter命名規範

SpringBoot提供的 starter 以 spring-boot-starter-xxx 的方式命名的。官方建議自定義的 starter 使用 xxx-spring-boot-starter 命名規則。以區分 SpringBoot 生態提供的 starter。如:mybatis-spring-boot-starter

3.自定義starter的步驟

現在就以自定義阿裡雲oss工具starter為例步驟如下:

  • 新建兩個maven模塊

​ (1)aliyun-oss-spring-boot-autoconfigure:自動配置核心代碼

​ (2)aliyun-oss-spring-boot-starter:管理依賴

  • 在aliyun-oss-spring-boot-autoconfigure的pom文件中引入以下依賴

    <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>com.aliyun.oss</groupId>
                <artifactId>aliyun-sdk-oss</artifactId>
                <version>3.15.1</version>
            </dependency>
            <dependency>
                <groupId>javax.xml.bind</groupId>
                <artifactId>jaxb-api</artifactId>
                <version>2.3.1</version>
            </dependency>
            <dependency>
                <groupId>javax.activation</groupId>
                <artifactId>activation</artifactId>
                <version>1.1.1</version>
            </dependency>
            <!-- no more than 2.3.3-->
            <dependency>
                <groupId>org.glassfish.jaxb</groupId>
                <artifactId>jaxb-runtime</artifactId>
                <version>2.3.3</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-configuration-processor</artifactId>
                <optional>true</optional>
            </dependency>
    </dependencies>
    
  • 在aliyun-oss-spring-boot-autoconfigure的java裡面的對應的包里新建三個文件

    AliOSSProperties.java

    package com.minqiliang;
    
    
    import org.springframework.boot.context.properties.ConfigurationProperties;
    
    @ConfigurationProperties("aliyun.oss")
    public class AliOSSProperties {
        private String endpoint;
        private String accessKeyId;
        private String accessKeySecret;
        private String bucketName;
    
        /**
         * 獲取
         * @return endpoint
         */
        public String getEndpoint() {
            return endpoint;
        }
    
        /**
         * 設置
         * @param endpoint
         */
        public void setEndpoint(String endpoint) {
            this.endpoint = endpoint;
        }
    
        /**
         * 獲取
         * @return accessKeyId
         */
        public String getAccessKeyId() {
            return accessKeyId;
        }
    
        /**
         * 設置
         * @param accessKeyId
         */
        public void setAccessKeyId(String accessKeyId) {
            this.accessKeyId = accessKeyId;
        }
    
        /**
         * 獲取
         * @return accessKeySecret
         */
        public String getAccessKeySecret() {
            return accessKeySecret;
        }
    
        /**
         * 設置
         * @param accessKeySecret
         */
        public void setAccessKeySecret(String accessKeySecret) {
            this.accessKeySecret = accessKeySecret;
        }
    
        /**
         * 獲取
         * @return bucketName
         */
        public String getBucketName() {
            return bucketName;
        }
    
        /**
         * 設置
         * @param bucketName
         */
        public void setBucketName(String bucketName) {
            this.bucketName = bucketName;
        }
    }
    

    AliOSSUtils.java

    package com.minqiliang;
    
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import org.springframework.web.multipart.MultipartFile;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.UUID;
    
    /**
     * 阿裡雲 OSS 工具類
     */
    
    public class AliOSSUtils {
    
        private AliOSSProperties aliOSSProperties;
    
        public AliOSSProperties getAliOSSProperties() {
            return aliOSSProperties;
        }
    
        public void setAliOSSProperties(AliOSSProperties aliOSSProperties) {
            this.aliOSSProperties = aliOSSProperties;
        }
    
        /**
         * 實現上傳圖片到OSS
         */
        public String upload(MultipartFile file) throws IOException {
            String endpoint = aliOSSProperties.getEndpoint();
            String accessKeyId = aliOSSProperties.getAccessKeyId();
            String accessKeySecret = aliOSSProperties.getAccessKeySecret();
            String bucketName = aliOSSProperties.getBucketName();
            // 獲取上傳的文件的輸入流
            InputStream inputStream = file.getInputStream();
    
            // 避免文件覆蓋
            String originalFilename = file.getOriginalFilename();
            String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
    
            //上傳文件到 OSS
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
            ossClient.putObject(bucketName, fileName, inputStream);
    
            //文件訪問路徑
            String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
            // 關閉ossClient
            ossClient.shutdown();
            return url;// 把上傳到oss的路徑返回
        }
    
    }
    

    AliyunOssAutoConfigration.java

    package com.minqiliang;
    
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @EnableConfigurationProperties(AliOSSProperties.class)
    public class AliyunOssAutoConfigration {
    
        @Bean
        public AliOSSUtils aliOSSUtils(AliOSSProperties aliOSSProperties){
            AliOSSUtils aliossUtils = new AliOSSUtils();
            aliossUtils.setAliOSSProperties(aliOSSProperties);
            return  aliossUtils;
        }
    }
    
  • aliyun-oss-spring-boot-autoconfigure的resources文件加下新建META_INF/spring文件夾,然後再在spring文件夾里新建org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,文件內容為AliyunOssAutoConfigration類的全類名,如下

    com.minqiliang.AliyunOssAutoConfigration
    
  • 在aliyun-oss-spring-boot-starter的pom文件里引入aliyun-oss-spring-boot-autoconfigure依賴

    <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>com.minqiliang</groupId>
                <artifactId>aliyun-oss-spring-boot-autoconfigure</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
    </dependencies>
    
  • 目錄結構如下

    p9IltG8.png

  • 執行clean和install,把自定義的starter安裝到本地倉庫

  • 新建一個aliyun-starter-test模塊,進行測試,目錄結構如下:

    p9IlNRS.png

  • UploadController.java

    package com.example.controller;
    
    import com.example.pojo.Result;
    import com.minqiliang.AliOSSUtils;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.multipart.MultipartFile;
    
    import java.io.IOException;
    
    @RestController
    public class UploadController {
    
        @Autowired
        private AliOSSUtils aliOSSUtils;
    
        @PostMapping("upload")
        public Result upload(MultipartFile image) throws IOException {
            String url = aliOSSUtils.upload(image);
            return Result.success(url);
        }
    }
    

    Result.java

    package com.example.pojo;
    
    public class Result {
        private Integer code;//響應碼,1 代表成功; 0 代表失敗
        private String msg;  //響應信息 描述字元串
        private Object data; //返回的數據
    
        public Result() {
        }
    
        public Result(Integer code, String msg, Object data) {
            this.code = code;
            this.msg = msg;
            this.data = data;
        }
    
    
        //增刪改 成功響應
        public static Result success(){
            return new Result(1,"success",null);
        }
        //查詢 成功響應
        public static Result success(Object data){
            return new Result(1,"success",data);
        }
        //失敗響應
        public static Result error(String msg){
            return new Result(0,msg,null);
        }
    
        /**
         * 獲取
         * @return code
         */
        public Integer getCode() {
            return code;
        }
    
        /**
         * 設置
         * @param code
         */
        public void setCode(Integer code) {
            this.code = code;
        }
    
        /**
         * 獲取
         * @return msg
         */
        public String getMsg() {
            return msg;
        }
    
        /**
         * 設置
         * @param msg
         */
        public void setMsg(String msg) {
            this.msg = msg;
        }
    
        /**
         * 獲取
         * @return data
         */
        public Object getData() {
            return data;
        }
    
        /**
         * 設置
         * @param data
         */
        public void setData(Object data) {
            this.data = data;
        }
    
        public String toString() {
            return "Result{code = " + code + ", msg = " + msg + ", data = " + data + "}";
        }
    }
    
  • pom文件引入aliyun-oss-spring-boot-starter依賴

    <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>com.minqiliang</groupId>
                <artifactId>aliyun-oss-spring-boot-starter</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
    </dependencies>
    
  • application.yml里配置自己的阿裡雲oss信息,如下

    aliyun:
      oss:
        endpoint: 填寫自己的
        accessKeyId: 填寫自己的
        accessKeySecret: 填寫自己的
        bucketName: 填寫自己的
    
  • 啟動測試項目,使用postman上傳一個文件,結果如下,說明starter配置成功

    {
        "code": 1,
        "msg": "success",
        "data": "https://tlias-manage.oss-cn-hangzhou.aliyuncs.com/8713ed3d-751c-4d54-8a64-239b1ccb0da4.jpg"
    }
    

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 什麼是行為機 顧名思義,類比狀態機每個節點是一個狀態,行為機每個節點是描述一種行為。行為機每個節點之間是互斥的,並且節點相互之間完全不用關心是怎麼切換的。這裡就不講狀態機跟行為樹是怎麼做ai的了,這裡只講用行為機怎麼做一個ai。舉個例子 mmo中的小怪策劃案,大致會這麼寫: 小怪在出生點周圍巡邏。發 ...
  • AI框架 1. 幾種AI的設計 AI在游戲中很多,但是為什麼大家總是感覺ai編寫起來十分困難,我後來思考了一番,主要原因是使用的方法不當。之前大家編寫ai主要有幾種方案: a. 狀態機 我是不知道誰想出來這個做法的,真是無力吐槽。本來對象身上任何數據都是狀態,這種方法又要把一些狀態定義成一種新的節點 ...
  • >本文時間 2023-05-20 >作者:sugerqube漆瓷 `cd`,`vi`,`clear`這些屬於常見常用命令本文不再贅述。 # 安裝命令 `yum install vim`舉例安裝vim `rpm -ivh a.rpm b.rpm c.rpm`舉例安裝a,b,c(涉及包相互依賴) # 用 ...
  • 網上的教學視頻大部分全是以centos為教材底子——沒辦法更換系統了,這樣方便麻! 我參考的文章: https://blog.csdn.net/shengjie87/article/details/106805105#:~:text=%E7%94%A8%E6%8C%82%E8%BD%BD%E5%85 ...
  • Wayland 配置起來確實相對麻煩很多,需要註意很多細節,如果不註意就會出現問題,在這裡說一下可能的現象與解決方法。 根據觀察,這些現象在 GNOME 與 KDE 桌面環境鐘均會出現。 ## 現象 ### App 打開慢 現象為當首次打開一個圖形化的 App 時,需要等待2-3秒鐘才會打開,但是如 ...
  • 上一講我們安裝 etcd 服務端,這一講我們來一起學學如何使用 etcd 客戶端常見的命令。文章內容來源於參考資料,如若侵權,請聯繫刪除,謝謝。 > etcd可通過客戶端命令行工具 etcdctl 對etcd進行請求操作 ```sh # 幫助命令,會列出所有的命令和選項,在記不太清命令的時候,可以使 ...
  • > 本文首發於公眾號:Hunter後端 > 原文鏈接:[es筆記四之中文分詞插件安裝與使用](https://mp.weixin.qq.com/s/aQuwrUzLZDKLv_K8dKeVzw) 前面我們介紹的操作及演示都是基於英語單詞的分詞,但我們大部分使用的肯定都是中文,所以如果需要使用分詞的操 ...
  • 在上一篇博客中,我們介紹了用Python對來實現一個Scheme求值器。然而,我們跳過了部分特殊形式(special forms)和基本過程(primitive procedures)實現的介紹,如特殊形式中的delay、cons-stream,基本過程中的force、streawn-car、str... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...