0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何编写一个自己的 starter

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-10-08 14:42 次阅读

前面给大家介绍了 SpringBoot 的自动装配功能,相信大家对自动装配都有了很好的理解,那么今天阿粉通过一个示例来给大家演示一下如何编写一个自己的 starter

再编写 starter 之前我们先了解一下什么是 starter,一个 starter 其实就是对一个功能的集成封装,然后对外提供一个依赖,让业务去使用,像我们熟悉的 Redismongomybatis 等。另外由于任何人都可以编写自己的 starter,那么为了区分官方的 starter 和个人的 starter,通常在命名上面会有一个规范。所以 SpringBoot 官方提出,第三方在建立自己的 Starter 的时候命名规则统一用xxx-spring-boot-starter,而官方提供的 Starter 统一命名方式为spring-boot-starter-xxx

通过我们前面的文章,我们知道自动装配首先要有一个配置类,其次还要有 spring.factories 文件,所以这两步是必不可少的。接下来我们就实操一下。

编写配置类

编写配置类首先要添加一个自动装配的依赖,然后再编写对应的配置类和业务实现类,在 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;
  }
}

业务实现类

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;
  }
}

简单说明一下上面三个类都是干什么的,MyHashTemplate 该类是实际业务需要注入的类,用来对入参进行 MD5 摘要,然后返回一个拼接了前缀的字符串给业务。这个前缀是通过 application.properties 中配置 ziyou.hash.hashPre=JavaGeekTech666 配置后传递过来的。MyHashProperties 是接受属性值的类,MyHashAutoConfiguration 则是自动装配类,这个类会根据条件进行 MyHashTemplate``Bean 的初始化,并将前缀进行赋值。

增加配置文件

最后还需要在 resource 文件中编写一个 META-INF/spring.factories 文件,内容如下

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

前面的 Key 是固定写法,后面的 value 就是配置类的全路径引用地址。

在项目中使用

编写完了 starter 过后,我们再创建一个新的 web 应用,在其中增加我们编写的 starter 来验证是否成功。第一步在 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

启动项目,我们访问地址 http://127.0.0.1:8080/hello?name=ziyou 可以看到效果如下。

图片

至此可以看到,我们自己编写的 starter 已经成功生效了,只不过功能很简单而已,我们完全可以根据自己需要的实际功能来实现一个复杂一点的 starter 来提供开箱即用的效果。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 封装
    +关注

    关注

    126

    文章

    7740

    浏览量

    142631
  • 文件
    +关注

    关注

    1

    文章

    561

    浏览量

    24677
  • 配置
    +关注

    关注

    1

    文章

    187

    浏览量

    18343
  • Starter
    +关注

    关注

    0

    文章

    8

    浏览量

    7528
收藏 人收藏

    评论

    相关推荐

    嵌入式Qt-动手编写并运行自己的第1ARM-Qt程序

    本篇详细介绍了如何自己编写Qt程序,如何通过交叉编译,最终放到开发板中执行的过程。
    的头像 发表于 06-02 09:06 8526次阅读
    嵌入式Qt-动手<b class='flag-5'>编写</b>并运行<b class='flag-5'>自己</b>的第1<b class='flag-5'>个</b>ARM-Qt程序

    编写一个QT程序

    学习种编程语言或编程环境,通常会先编写“Hello World”程序。我们也用 Qt Creator 编写
    发表于 11-21 10:41 1000次阅读

    自己编写时钟函数

    今天刚刚看完郭老师的视频,照着视频自己编写的时钟函数。由于水平不高,导致程序太大,有部分没有写全。希望各位高手指点
    发表于 08-11 19:30

    新手分享自己编写的单词本记录及复习小软件

    新手分享自己编写的单词本记录及复习小软件
    发表于 01-08 02:01

    怎么编写自己的软件写入EEPROM

    大家好,谁能指引我到地方,我可以找到需要的信息来编写应用程序。我需要做我自己的自定义界面
    发表于 09-03 14:09

    编写属于自己的PCB设计规则检查器

    编写属于自己的PCB设计规则检查器 编写属于自己的PCB设计规则检查器具有很多优点,尽管设计检查器并不那么简单,但也并非高不可攀,因为任何熟悉现有编程或脚本
    发表于 12-27 13:31 860次阅读
    <b class='flag-5'>编写</b>属于<b class='flag-5'>自己</b>的PCB设计规则检查器

    简单的组合逻辑编写

    简单的组合逻辑编写 实验内容:完成实验内容:
    发表于 02-08 14:37 994次阅读

    如何使用Python编写桌面软件系统?步骤有哪些

    建议直接用python编写网页服务器,然后就在本机用浏览器来使用。
    的头像 发表于 01-25 12:08 4826次阅读

    如何使用Python编写简单的程序

    按照软件行业传统习惯,当你学习种新的编程语言如Python时,首先编写“Hello World! ”程序。请执行以下步骤,以创造你的“Hello World!” Python程序
    的头像 发表于 01-16 15:21 2.2w次阅读

    如何编写一个hello world程序

    本文简单介绍如何编写一个hello world程序,以及程序是如何被执行的
    的头像 发表于 03-02 17:31 8314次阅读
    如何<b class='flag-5'>编写</b>第<b class='flag-5'>一个</b>hello world程序

    编写闪烁LED灯代码

    电子发烧友网站提供《编写闪烁LED灯代码.zip》资料免费下载
    发表于 10-24 10:55 2次下载
    <b class='flag-5'>编写</b><b class='flag-5'>一</b><b class='flag-5'>个</b>闪烁LED灯代码

    手把手教你编写上位机

    本次来教大家编写基于QT的简单的上位机。 学习新的东西我们都从最基础地实例开始,比如学习C语言我们会从
    发表于 05-08 10:36 1次下载
    手把手教你<b class='flag-5'>编写</b><b class='flag-5'>一</b><b class='flag-5'>个</b>上位机

    QT|编写简单的上位机

    QT | 编写简单的上位机 时间 :2023-03-19文章目录QT | 编写简单的上位
    发表于 05-08 10:12 3次下载
    QT|<b class='flag-5'>编写</b><b class='flag-5'>一</b><b class='flag-5'>个</b>简单的上位机

    编写点名器脚本

    目的:编写脚本,可以将准别好的名字合集的.txt传入脚本,然后每次随机显示一个人的姓名
    的头像 发表于 11-06 12:41 557次阅读
    <b class='flag-5'>编写</b><b class='flag-5'>一</b><b class='flag-5'>个</b>点名器脚本

    如何自己搭建服务器?

    如何自己搭建服务器?自己搭建服务器涉及到硬件和软件两
    的头像 发表于 12-12 16:52 3725次阅读