前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手把手带你编写属于自己的 starter

手把手带你编写属于自己的 starter

作者头像
Java极客技术
发布2022-12-04 13:12:49
2220
发布2022-12-04 13:12:49
举报
文章被收录于专栏:Java极客技术

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

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

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

编写配置类

编写配置类首先要添加一个自动装配的依赖,然后再编写对应的配置类和业务实现类,在 pom 中添加如下依赖

代码语言:javascript
复制
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-autoconfigure</artifactId>
      <version>2.7.1</version>
    </dependency>

装配类

代码语言:javascript
复制
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;
  }
}

属性类

代码语言:javascript
复制
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;
  }
}

业务实现类

代码语言:javascript
复制
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 文件,内容如下

代码语言:javascript
复制
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.hash.starter.config.MyHashAutoConfiguration

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

在项目中使用

编写完了 starter 过后,我们再创建一个新的 web 应用,在其中增加我们编写的 starter 来验证是否成功。第一步在 pom 文件中增加依赖

代码语言:javascript
复制
    <dependency>
      <groupId>com.starter.example</groupId>
      <artifactId>myhash-spring-boot-starter</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    </dependency>
代码语言:javascript
复制
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);
  }
}

代码语言:javascript
复制
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 文件中增加如下配置

代码语言:javascript
复制
ziyou.hash.hashPre=JavaGeekTech

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

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

在一些大公司特别是一些中间件或者中台团队,很多时候都是提供各种工具的 starter 来给业务团队使用的,毕竟很多重复的功能如果每个业务团队都自己开发的话,完全是浪费资源,通过中台团队统一封装 starter,让各个业务团队拿来就用快速搭建业务即可。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java极客技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 编写配置类
  • 增加配置文件
  • 在项目中使用
相关产品与服务
云数据库 Redis®
腾讯云数据库 Redis®(TencentDB for Redis®)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档