天天看點

如何建立自定義starter (寫的真棒)

作者:bobo棒

Springboot-starter-自定義

如何建立自定義starter (寫的真棒)

1.starter工作原理

  • 自動依賴管理:Spring Boot Starter使用Maven或Gradle作為建構工具,并提供了一組預定義的Starter依賴。當我們在項目的建構配置檔案中添加這些Starter依賴時,它們會自動管理相關的依賴項。例如,如果我們添加了spring-boot-starter-web依賴,它會自動管理與Web開發相關的依賴項,如Spring MVC、Tomcat等。
  • 自動配置:Spring Boot Starter提供了一組自動配置類,它們根據項目的依賴和配置來自動配置應用程式的各個元件。自動配置類根據特定的約定和預設值來完成配置,無需手動編寫大量的配置代碼。例如,如果我們添加了spring-boot-starter-data-jpa依賴,它會自動配置JPA實體管理器、資料源和事務管理器等。
  • 條件化配置:Spring Boot Starter使用條件化配置來決定是否應用某個自動配置。條件化配置是基于一組條件的,這些條件可以根據環境、類路徑或配置檔案中的屬性來判斷。隻有滿足特定條件時,相應的自動配置才會被應用。例如,根據是否存在特定的資料庫驅動依賴,決定是否自動配置與資料庫相關的元件。
  • 提供預設值:Spring Boot Starter為各個元件提供了預設值,這些預設值可以在應用程式的配置檔案中進行覆寫。這使得開發人員可以根據需要自定義配置,同時又可以友善地使用預設配置。例如,我們可以在應用程式的配置檔案中設定資料庫連接配接資訊,覆寫預設的資料庫配置。
  • 擴充點:Spring Boot Starter提供了擴充點,允許開發人員根據需求進行自定義和修改預設的自動配置行為。我們可以編寫自己的配置類,使用注解和條件化配置來定制自動配置。這樣,我們可以根據應用程式的特殊需求,進行個性化的配置和擴充。

舉個例子,假設我們想開發一個Web應用程式,我們可以使用spring-boot-starter-web作為依賴,它會自動管理與Web開發相關的依賴項。同時,Spring Boot Starter會自動配置Spring MVC、Tomcat等元件,簡化我們的開發工作。我們可以根據需要在配置檔案中覆寫預設的配置,或編寫自定義的配置類來修改預設的自動配置行為。這樣,我們可以快速啟動一個具有基本Web功能的應用程式,而無需手動處理繁瑣的配置和依賴項管理。

2.為什麼要自定義starter

自定義Spring Boot Starter是為了更好地組織和複用自己的代碼,以及友善其他開發者在他們的Spring Boot應用程式中使用。以下是一些自定義Starter的好處:

  • 子產品化群組織代碼:自定義Starter使得我們能夠将相關的功能子產品、依賴項和配置封裝在一個子產品中。這樣可以更好地組織和管理代碼,使代碼結構更清晰和可維護。
  • 簡化配置和依賴項管理:通過自定義Starter,我們可以将一組相關的依賴項和配置封裝在一個子產品中,并提供一個簡單的依賴項供其他開發者使用。這樣其他開發者在使用我們的Starter時,無需手動添加一大堆的依賴項和進行複雜的配置,可以直接引入Starter依賴并獲得預設的配置。
  • 提供可插拔和可擴充的功能:自定義Starter可以提供一組可插拔和可擴充的功能,供其他開發者在他們的應用程式中使用。這樣其他開發者可以根據自己的需求,選擇性地引入并使用我們的Starter中的功能,進而實作定制化的擴充。
  • 促進團隊合作和代碼共享:自定義Starter可以幫助團隊成員共享和複用代碼。通過将常用的功能封裝在Starter中,團隊成員可以更友善地在不同的項目中複用這些功能,提高開發效率和代碼品質。
  • 提供行業标準和最佳實踐:通過自定義Starter,我們可以定義一組行業标準和最佳實踐,供其他開發者在他們的應用程式中采用。這有助于確定應用程式的一緻性和規範性,并遵循最佳實踐,提高應用程式的可維護性和可擴充性。

總之,自定義Spring Boot Starter能夠簡化應用程式的配置和依賴項管理,提供可插拔和可擴充的功能,促進團隊合作和代碼共享,同時也可以推廣行業标準和最佳實踐。這使得我們能夠更好地開發和維護Spring Boot應用程式,并提供更好的開發體驗和代碼品質。

3.自定義starter的工作場景

自定義Spring Boot Starter的工作場景可以包括以下情況:

  • 垂直領域的功能封裝:如果你在某個特定的垂直領域有一組常用的功能,你可以将這些功能封裝在一個自定義的Starter中。例如,你可能開發了一套用于支付內建的工具類、一套用于消息隊列操作的庫,或者一套用于檔案存儲和管理的元件。通過自定義Starter,其他開發者可以輕松引入和使用這些功能,提高開發效率。
  • 企業内部的共享元件:如果你在企業内部有一些通用的元件或庫,可以将其封裝在自定義的Starter中,供企業内部的項目使用。這樣可以促進代碼的複用和共享,并確定各個項目之間的一緻性和規範性。
  • 快速啟動項目的基礎架構:如果你經常使用某個基礎架構來啟動新項目,你可以将該架構封裝在一個自定義的Starter中。這個Starter可以包含項目常用的依賴項、配置和一些通用的功能。當你要啟動新項目時,隻需引入這個Starter依賴,即可快速搭建項目的基礎架構,省去了手動配置的麻煩。
  • 第三方服務的內建:如果你需要內建某個第三方服務到你的應用程式中,可以将這個內建過程封裝在一個自定義的Starter中。這個Starter可以提供對第三方服務的API調用、配置封裝以及其他必要的內建功能。其他開發者在使用該第三方服務時,隻需引入這個Starter依賴,并進行簡單的配置,即可快速內建該服務。
  • 架構或庫的擴充和定制:如果你使用某個架構或庫,并希望對其進行擴充或定制,可以将這些定制化的功能封裝在一個自定義的Starter中。這個Starter可以包含定制化的配置、拓展的功能或額外的工具類。其他開發者在使用該架構或庫時,可以選擇性地引入這個Starter依賴,以擷取定制化的功能和特性。

總結起來,自定義Spring Boot Starter的工作場景包括封裝垂直領域的功能、企業内部共享元件、快速啟動項目的基礎架構、第三方服務內建以及架構或庫的擴充和定制。通過自定義Starter,可以提高代碼的複用性、開發效率和項目的一緻性。

4.案例 自定義檔案的上傳的starter

自定義一個檔案上傳的Spring Boot Starter是一個很好的示例,以下是一個基本的實作,包括相關的代碼和配置檔案。請注意,這隻是一個簡單的示例,可能需要根據你的具體需求進行擴充和定制。

首先,我們建立一個Maven項目,并添加必要的依賴項和檔案結構:

  1. 建立一個Maven項目,命名為file-upload-starter。
  2. 在pom.xml檔案中添加以下依賴項:
<dependencies>
    <!-- Spring Boot Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <!-- Commons FileUpload -->
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.4</version>
    </dependency>
</dependencies>           
  1. 建立以下檔案結構:
如何建立自定義starter (寫的真棒)

FileUploadAutoConfiguration.java

@Configuration
// 注解表示隻有在類路徑中存在 FileUploadService 類時,才會建立該配置類的Bean。這是一種條件化配置,確定隻有在特定條件下才會生效。
@ConditionalOnClass(FileUploadService.class)
//注解用于啟用配置屬性類 FileUploadProperties 的綁定。這樣,可以從配置檔案中讀取屬性值,并通過構造函數注入到配置類中。
@EnableConfigurationProperties(FileUploadProperties.class)
public class FileUploadAutoConfiguration {
    //這是一個配置屬性類的執行個體,用于儲存從配置檔案中讀取的屬性值。通過構造函數注入,可以友善地在配置類中使用這些屬性。
    private final FileUploadProperties properties;
    //這是配置類的構造函數,它接受一個 FileUploadProperties 對象作為參數。通過将配置屬性對象作為構造函數參數,可以将從配置檔案中讀取的屬性值傳遞給配置類。
    public FileUploadAutoConfiguration(FileUploadProperties properties) {
        this.properties = properties;
    }
}           
  • FileUploadProperties
package com.bw.upload;

import org.springframework.boot.context.properties.ConfigurationProperties;
//這個注解告訴Spring Boot将以 file.upload 作為字首的配置屬性綁定到這個類的對應屬性上。
@ConfigurationProperties(prefix = "file.upload")
public class FileUploadProperties {
    /**
     * 預設檔案上傳路徑,調用者可以在application.properties更改其他路徑
     * 如com.upload.path=f:/upload
     */
    private String path="d:/upload";
    
    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }
}           

FileUploadService 檔案上傳的類

package com.bw.upload;

import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

@Component
public class FileUploadService {

    private  FileUploadProperties fileUploadProperties;

    public FileUploadService(FileUploadProperties fileUploadProperties) {
        this.fileUploadProperties = fileUploadProperties;
    }

    /**
     * @param file
     * @return 檔案上傳, 并傳回上傳的檔案
     * @throws IOException
     */

    public String uploadFile(MultipartFile file) throws IOException {
        if (file == null || file.isEmpty()) {
            throw new IllegalArgumentException("請選擇檔案");
        }

        String originalFilename = file.getOriginalFilename();//擷取原始檔案名
        String fileExtension = originalFilename.substring(originalFilename.lastIndexOf("."));//擷取檔案字尾
        String generatedFileName = UUID.randomUUID().toString() + fileExtension;//防止檔案重名,随機産生一個檔案名
        File targetFile = new File(fileUploadProperties.getPath(), generatedFileName);
        file.transferTo(targetFile);//儲存檔案
        return targetFile.getAbsolutePath();
    }
}           

最後,我們需要在META-INF/spring.factories檔案中聲明自動配置類:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.bw.upload.FileUploadAutoConfiguration           

把以上starter 安裝到本地倉庫

現在,我們已經完成了自定義檔案上傳的Spring Boot Starter。下面是一個簡單的示例應用程式,用于示範如何使用這個Starter:

在項目中依賴該starter

<dependency>
            <groupId>com.bw</groupId>
            <artifactId>upload-boot-starter</artifactId>
            <version>1.0-SNAPSHOT</version>
     </dependency>
           

直接調用

@Autowired
   FileUploadService fileUploadService;

    @RequestMapping("upFile")
    public Result upload(MultipartFile file) throws IOException {
        String path = fileUploadService.uploadFile(file);
        return Result.success(path);
    }
           

最後,我們需要在應用程式的配置檔案(例如application.properties)中配置上傳目錄:

file.upload.path=d:/upload           

可以使用postman進行測試上傳,結果完美搞定

如何建立自定義starter (寫的真棒)

以上是一個簡單的自定義檔案上傳的Spring Boot Starter的示例。你可以根據自己的需求進行修改和擴充。要運作示例應用程式,你需要将Starter項目建構為jar檔案,并将其作為依賴項添加到示例應用程式中。

繼續閱讀