0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何編寫一個(gè)自己的 starter

科技綠洲 ? 來(lái)源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-08 14:42 ? 次閱讀

前面給大家介紹了 SpringBoot 的自動(dòng)裝配功能,相信大家對(duì)自動(dòng)裝配都有了很好的理解,那么今天阿粉通過(guò)一個(gè)示例來(lái)給大家演示一下如何編寫一個(gè)自己的 starter。

再編寫 starter 之前我們先了解一下什么是 starter,一個(gè) starter 其實(shí)就是對(duì)一個(gè)功能的集成封裝,然后對(duì)外提供一個(gè)依賴,讓業(yè)務(wù)去使用,像我們熟悉的 Redis,mongo,mybatis 等。另外由于任何人都可以編寫自己的 starter,那么為了區(qū)分官方的 starter 和個(gè)人的 starter,通常在命名上面會(huì)有一個(gè)規(guī)范。所以 SpringBoot 官方提出,第三方在建立自己的 Starter 的時(shí)候命名規(guī)則統(tǒng)一用xxx-spring-boot-starter,而官方提供的 Starter 統(tǒng)一命名方式為spring-boot-starter-xxx。

通過(guò)我們前面的文章,我們知道自動(dòng)裝配首先要有一個(gè)配置類,其次還要有 spring.factories 文件,所以這兩步是必不可少的。接下來(lái)我們就實(shí)操一下。

編寫配置類

編寫配置類首先要添加一個(gè)自動(dòng)裝配的依賴,然后再編寫對(duì)應(yīng)的配置類和業(yè)務(wù)實(shí)現(xiàn)類,在 pom 中添加如下依賴

< dependency >
      < groupId >org.springframework.boot< /groupId >
      < artifactId >spring-boot-autoconfigure< /artifactId >
      < version >2.7.1< /version >
    < /dependency >

裝配類

package com.example.hash.starter.config;

import com.example.hash.starter.service.MyHashTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConditionalOnClass({MyHashTemplate.class})
@EnableConfigurationProperties(MyHashProperties.class)
public class MyHashAutoConfiguration {

  @Autowired
  MyHashProperties myHashProperties;

  @Bean
  @ConditionalOnMissingBean(MyHashTemplate.class)
  public MyHashTemplate myJsonService() {
    MyHashTemplate myHashTemplate = new MyHashTemplate();
    myHashTemplate.setPrefix(myHashProperties.getHashPre());
    return myHashTemplate;
  }
}

屬性類

package com.example.hash.starter.config;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "ziyou.hash")
public class MyHashProperties {
  private String hashPre;

  public String getHashPre() {
    return hashPre;
  }

  public void setHashPre(String hashPre) {
    this.hashPre = hashPre;
  }
}

業(yè)務(wù)實(shí)現(xiàn)類

package com.example.hash.starter.service;

import javax.xml.bind.DatatypeConverter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MyHashTemplate {

  private String prefix;

  public String myHash(String origin) {
    if (null == origin || origin.length() == 0) {
      return null;
    }
    try {
      MessageDigest md = MessageDigest.getInstance("MD5");
      md.update(origin.getBytes());
      byte[] digest = md.digest();
      return this.prefix + ":" + DatatypeConverter.printHexBinary(digest).toUpperCase();
    } catch (NoSuchAlgorithmException e) {
      throw new RuntimeException(e);
    }
  }

  public void setPrefix(String prefix) {
    this.prefix = prefix;
  }
}

簡(jiǎn)單說(shuō)明一下上面三個(gè)類都是干什么的,MyHashTemplate 該類是實(shí)際業(yè)務(wù)需要注入的類,用來(lái)對(duì)入?yún)⑦M(jìn)行 MD5 摘要,然后返回一個(gè)拼接了前綴的字符串給業(yè)務(wù)。這個(gè)前綴是通過(guò) application.properties 中配置 ziyou.hash.hashPre=JavaGeekTech666 配置后傳遞過(guò)來(lái)的。MyHashProperties 是接受屬性值的類,MyHashAutoConfiguration 則是自動(dòng)裝配類,這個(gè)類會(huì)根據(jù)條件進(jìn)行 MyHashTemplate``Bean 的初始化,并將前綴進(jìn)行賦值。

增加配置文件

最后還需要在 resource 文件中編寫一個(gè) META-INF/spring.factories 文件,內(nèi)容如下

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.hash.starter.config.MyHashAutoConfiguration

前面的 Key 是固定寫法,后面的 value 就是配置類的全路徑引用地址。

在項(xiàng)目中使用

編寫完了 starter 過(guò)后,我們?cè)賱?chuàng)建一個(gè)新的 web 應(yīng)用,在其中增加我們編寫的 starter 來(lái)驗(yàn)證是否成功。第一步在 pom 文件中增加依賴

< dependency >
      < groupId >com.starter.example< /groupId >
      < artifactId >myhash-spring-boot-starter< /artifactId >
      < version >0.0.1-SNAPSHOT< /version >
    < /dependency >
package com.example.demo.controller;

import com.example.demo.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

  @Autowired
  private HelloService helloService;

  @GetMapping(value = "/hello")
  public String hello(@RequestParam("name") String name) {
    return helloService.sayHello(name);
  }
}
package com.example.demo.service;

import com.example.hash.starter.service.MyHashTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class HelloService {
  @Autowired
  private MyHashTemplate myHashTemplate;

  public String sayHello(String name) {
    return myHashTemplate.myHash(name);
  }
}

application.properties 文件中增加如下配置

ziyou.hash.hashPre=JavaGeekTech

啟動(dòng)項(xiàng)目,我們?cè)L問(wèn)地址 http://127.0.0.1:8080/hello?name=ziyou 可以看到效果如下。

圖片

至此可以看到,我們自己編寫的 starter 已經(jīng)成功生效了,只不過(guò)功能很簡(jiǎn)單而已,我們完全可以根據(jù)自己需要的實(shí)際功能來(lái)實(shí)現(xiàn)一個(gè)復(fù)雜一點(diǎn)的 starter 來(lái)提供開箱即用的效果。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 封裝
    +關(guān)注

    關(guān)注

    126

    文章

    7647

    瀏覽量

    142454
  • 文件
    +關(guān)注

    關(guān)注

    1

    文章

    555

    瀏覽量

    24633
  • 配置
    +關(guān)注

    關(guān)注

    1

    文章

    187

    瀏覽量

    18322
  • Starter
    +關(guān)注

    關(guān)注

    0

    文章

    8

    瀏覽量

    7526
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    嵌入式Qt-動(dòng)手編寫并運(yùn)行自己的第1個(gè)ARM-Qt程序

    本篇詳細(xì)介紹了如何自己編寫個(gè)Qt程序,如何通過(guò)交叉編譯,最終放到開發(fā)板中執(zhí)行的過(guò)程。
    的頭像 發(fā)表于 06-02 09:06 ?8495次閱讀
    嵌入式Qt-動(dòng)手<b class='flag-5'>編寫</b>并運(yùn)行<b class='flag-5'>自己</b>的第1<b class='flag-5'>個(gè)</b>ARM-Qt程序

    編寫一個(gè)QT程序

    學(xué)習(xí)種編程語(yǔ)言或編程環(huán)境,通常會(huì)先編寫個(gè)“Hello World”程序。我們也用 Qt Creator 編寫
    發(fā)表于 11-21 10:41 ?977次閱讀

    自己編寫個(gè)時(shí)鐘函數(shù)

    今天剛剛看完郭老師的個(gè)視頻,照著視頻自己編寫的時(shí)鐘函數(shù)。由于水平不高,導(dǎo)致程序太大,有部分沒(méi)有寫全。希望各位高手指點(diǎn)
    發(fā)表于 08-11 19:30

    新手分享個(gè)自己編寫的單詞本記錄及復(fù)習(xí)小軟件

    新手分享個(gè)自己編寫的單詞本記錄及復(fù)習(xí)小軟件
    發(fā)表于 01-08 02:01

    怎么編寫自己的軟件寫入EEPROM

    大家好,誰(shuí)能指引我到個(gè)地方,我可以找到需要的信息來(lái)編寫個(gè)應(yīng)用程序。我需要做我自己的自定義界面
    發(fā)表于 09-03 14:09

    編寫屬于自己的PCB設(shè)計(jì)規(guī)則檢查器

    編寫屬于自己的PCB設(shè)計(jì)規(guī)則檢查器 編寫屬于自己的PCB設(shè)計(jì)規(guī)則檢查器具有很多優(yōu)點(diǎn),盡管設(shè)計(jì)檢查器并不那么簡(jiǎn)單,但也并非高不可攀,因?yàn)槿魏问煜がF(xiàn)有編程或腳本
    發(fā)表于 12-27 13:31 ?845次閱讀
    <b class='flag-5'>編寫</b>屬于<b class='flag-5'>自己</b>的PCB設(shè)計(jì)規(guī)則檢查器

    個(gè)簡(jiǎn)單的組合邏輯編寫

    個(gè)簡(jiǎn)單的組合邏輯編寫 實(shí)驗(yàn)內(nèi)容:完成實(shí)驗(yàn)內(nèi)容:
    發(fā)表于 02-08 14:37 ?980次閱讀

    如何使用Python編寫個(gè)桌面軟件系統(tǒng)?步驟有哪些

    建議直接用python編寫個(gè)網(wǎng)頁(yè)服務(wù)器,然后就在本機(jī)用瀏覽器來(lái)使用。
    的頭像 發(fā)表于 01-25 12:08 ?4803次閱讀

    如何使用Python編寫個(gè)簡(jiǎn)單的程序

    按照軟件行業(yè)傳統(tǒng)習(xí)慣,當(dāng)你學(xué)習(xí)種新的編程語(yǔ)言如Python時(shí),首先編寫個(gè)“Hello World! ”程序。請(qǐng)執(zhí)行以下步驟,以創(chuàng)造你的“Hello World!” Python程序
    的頭像 發(fā)表于 01-16 15:21 ?2.2w次閱讀

    如何編寫一個(gè)hello world程序

    本文簡(jiǎn)單介紹如何編寫一個(gè)hello world程序,以及程序是如何被執(zhí)行的
    的頭像 發(fā)表于 03-02 17:31 ?8259次閱讀
    如何<b class='flag-5'>編寫</b>第<b class='flag-5'>一個(gè)</b>hello world程序

    編寫個(gè)閃爍LED燈代碼

    電子發(fā)燒友網(wǎng)站提供《編寫個(gè)閃爍LED燈代碼.zip》資料免費(fèi)下載
    發(fā)表于 10-24 10:55 ?2次下載
    <b class='flag-5'>編寫</b><b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>閃爍LED燈代碼

    手把手教你編寫個(gè)上位機(jī)

    本次來(lái)教大家編寫個(gè)基于QT的簡(jiǎn)單的上位機(jī)。 學(xué)習(xí)個(gè)新的東西我們都從最基礎(chǔ)地實(shí)例開始,比如學(xué)習(xí)C語(yǔ)言我們會(huì)從
    發(fā)表于 05-08 10:36 ?1次下載
    手把手教你<b class='flag-5'>編寫</b><b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>上位機(jī)

    QT|編寫個(gè)簡(jiǎn)單的上位機(jī)

    QT | 編寫個(gè)簡(jiǎn)單的上位機(jī) 時(shí)間 :2023-03-19文章目錄QT | 編寫個(gè)簡(jiǎn)單的上位
    發(fā)表于 05-08 10:12 ?3次下載
    QT|<b class='flag-5'>編寫</b><b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>簡(jiǎn)單的上位機(jī)

    編寫個(gè)點(diǎn)名器腳本

    目的:編寫個(gè)腳本,可以將準(zhǔn)別好的名字合集的.txt傳入腳本,然后每次隨機(jī)顯示一個(gè)人的姓名
    的頭像 發(fā)表于 11-06 12:41 ?525次閱讀
    <b class='flag-5'>編寫</b><b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>點(diǎn)名器腳本

    如何自己搭建個(gè)服務(wù)器?

    如何自己搭建個(gè)服務(wù)器?自己搭建個(gè)服務(wù)器涉及到硬件和軟件兩
    的頭像 發(fā)表于 12-12 16:52 ?3637次閱讀