当前位置: 首页 > 科技观察

指导大家写自己的Starter_0

时间:2023-03-18 22:49:59 科技观察

上一篇阿粉介绍了SpringBoot的自动组装功能。相信大家对自动装配都有很好的了解,所以今天阿粉通过一个例子来给大家介绍一下如何编写自己的starter。在写starter之前,我们先了解一下什么是starter。starter其实就是对一个功能的集成封装,然后对外提供一个依赖,供业务使用,比如我们熟悉的Redis、mongo、mybatis等。另外,由于任何人都可以编写自己的starter,为了区分官方starter和个人starter,在命名上通常会有规范。因此,SpringBoot官方提出第三方在构建自己的Starter时统一使用xxx-spring-boot-starter作为命名规则,而Starter官方的命名方式是spring-boot-starter-xxx。通过我们之前的文章,我们知道自动装配首先要有一个配置类,然后还要有一个spring.factories文件,所以这两步必不可少。接下来我们就来实践一下。编写配置类编写配置类首先要添加一个自动组装依赖,然后编写相应的配置类和业务实现类,在pom中添加如下依赖:org.springframework.bootspring-boot-autoconfigure2.7.1组装类:packagecom.example.hash.starter.config;导入com.example.hash.starter.service。MyHashTemplate;导入org.springframework.beans.factory.annotation.Autowired;导入org.springframework.boot.autoconfigure.condition.ConditionalOnClass;导入org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;导入org.springframework.boot.context。properties.EnableConfigurationProperties;导入org.springframework.context.annotation.Bean;导入org.springframework.context.annotation.Configuration;@Configuration@ConditionalOnClass({MyHashTemplate.class})@EnableConfigurationProperties(MyHashProperties.class)公共类MyHashAutoConfiguration{@MyHashProperties我的哈sh属性;@Bean@ConditionalOnMissingBean(MyHashTemplate.class)publicMyHashTemplatemyJsonService(){MyHashTemplatemyHashTemplate=newMyHashTemplate();myHashTemplate.setPrefix(myHashProperties.getHashPre());返回我的哈希模板;}}属性类:packagecom.example.hash.starter.config;importorg.springframework.boot.context.properties.ConfigurationProperties;@ConfigurationProperties(prefix="ziyou.hash")publicclassMyHashProperties{privateStringhashPre;publicStringgetHashPre(){返回hashPre;}publicvoidsetHashPre(StringhashPre){this.hashPre=hashPre;}}业务实现类:packagecom.example.hash.starter.service;importjavax.xml.bind.DatatypeConverter;importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;publicclassMyHashTemplate{privateStringprefix;publicStringmyHash(Stringorigin){if(null==origin||origin.length()==0){returnnull;}尝试{MessageDigestmd=MessageDigest.getInstance("MD5");md.update(origin.getBytes());byte[]digest=md.digest();返回this.prefix+":"+DatatypeConverter.printHexBinary(digest)。toUpperCase();}catch(NoSuchAlgorithmExceptione){thrownewRuntimeException(e);}}publicvoidsetPrefix(Stringprefix){this.prefix=prefix;}}简单说明一下上面三个类是干什么的,MyHashTemplate应该该类是实际业务中需要注入的类。用于对输入参数进行MD5摘要,然后返回一个带前缀的字符串给业务。这个前缀是通过application.properties中ziyou.hash.hashPre=JavaGeekTech666的配置传递的。MyHashProperties是一个接受属性值的类,MyHashAutoConfiguration是一个自动装配类。该类会根据条件初始化MyHashTemplateBean,并分配前缀。添加配置文件最后需要在资源文件中写入一个META-INF/spring.factories文件,内容如下:写入,后面的值是配置类的全路径引用地址。在项目中使用starter后,我们新建一个web应用,添加我们写的starter来验证是否成功。第一步在pom文件中添加依赖com.starter.examplemyhash-spring-boot-starter0.0.1-SNAPSHOT包com.example.demo.controller;导入com.example.demo.service.HelloService;导入org.springframework.beans.factory.annotation.Autowired;导入org.springframework.web.bind.annotation.GetMapping;导入org.springframework.web.bind.annotation.RequestParam;导入org.springframework.web.bind.annotation.RestController;@RestControllerpublicclassHelloController{@AutowiredprivateHelloServicehelloService;@GetMapping(value="/hello")publicStringhello(@RequestParam("name")Stringname){returnhelloService.sayHello(name);}}包com.example.demo.service;导入com.example.hash.starter.service.MyHashTemplate;导入org.springframework.beans.factory.annotation.Autowired;导入org.springframework。stereotype.Service;@ServicepublicclassHelloService{@AutowiredprivateMyHashTemplatemyHashTemplate;publicStringsayHello(Stringname){returnmyHashTemplate.myHash(name);}}在application.properties文件中添加如下配置:ziyou.hash.hashPre=JavaGeekTech启动项目,我们访问地址http://127.0.0.1:8080/hello?name=ziyou,可以看到效果如下:至此,可以看到我们写的starter已经成功生效,但是功能很简单。我们完全可以根据你需要的实际功能实现一个更复杂的starter,提供开箱即用的效果。在一些大公司,尤其是一些中间件或者中端团队,很多时候,为业务提供各种工具的starter是被团队使用的。毕竟,如果每个业务团队都自己开发很多重复的功能,那是一种资源的浪费。starter由中台团队统一打包,方便各业务团队使用,快速搭建业务。