我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么手写一个Spring Boot Starter

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么手写一个Spring Boot Starter

这篇文章将为大家详细讲解有关怎么手写一个Spring Boot Starter,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

何为 Starter ?

想必大家都使用过 SpringBoot,在 SpringBoot 项目中,使用最多的无非就是各种各样的 Starter 了。那何为 Starter 呢?你可以理解为一个可拔插式的插件(组件)。或者理解为场景启动器。

通过 Starter,能够简化以前繁杂的配置,无需过多的配置和依赖,它会帮你合并依赖,并且将其统一集成到一个 Starter 中,我们只需在 Maven 或 Gradle 中引入 Starter 依赖即可。SpringBoot 会自动扫描需要加载的信息并启动相应的默认配置。例如,如果你想使用 jdbc 插件,你只需引入 spring-boot-starter-jdbc 即可;如果你想使用 mongodb,你只需引入 spring-boot-starter-data-mongodb 依赖即可。

SpringBoot 官方提供了大量日常企业应用研发各种场景的 spring-boot-starter 依赖模块。这些依赖模块都遵循着约定成俗的默认配置,并允许我们根据自身情况调整这些配置。

总而言之,Starter 提供了以下功能:

  • 整合了模块需要的所有依赖,统一集合到 Starter 中。

  • 提供了默认配置,并允许我们调整这些默认配置。

  • 提供了自动配置类对模块内的 Bean 进行自动装配,注入 Spring 容器中。

Starter 命名规则

Spring 官方定义的 Starter 通常命名遵循的格式为 spring-boot-starter-{name},例如 spring-boot-starter-data-mongodb。Spring 官方建议,非官方 Starter 命名应遵循 {name}-spring-boot-starter 的格式,例如,myjson-spring-boot-starter。

自定义一个 Starter

了解了 Starter 的含义以及应用场景后,我们可以尝试手写一个 Starter,加深对它的了解以及能在实际工作中,开发出自己的 Starter,提高我们的开发效率。

可能有人会问 Starter 能干嘛呢?其实在我们的日常开发工作中,总有一些独立于业务系统之外的配置模块,它是可以在不同项目中进行复用的。如果在每个项目中都编写重复的模块代码,不仅浪费时间和人力,而且还和项目耦合。所以我们将这些可独立于业务代码之外的功能配置模块封装成一个 Starter,在需要用到此功能模块的项目中,只需要在其 pom.xml 文件中引用依赖即可,SpringBoot 帮我们完成自动装配,而且我们还可以在配置文件中调整 Starter 中默认的配置信息。

假设我们现在需要实现这样一个功能:

  1. 根据用户提供的 Java 对象,将其转换为 JSON 形式,并且在 JSON 字符串中添加指定的前辍和后辍。

  2. 用户可以动态改变前辍和后辍,即可在 yml 或 properties 配置文件中自定义。

举个栗子,假如用户输入下面这个类的对象 person:

public class Person { private String name; private int age; private String address; public Person(String name, int age, String address) {  super();  this.name = name;  this.age = age;  this.address = address; } // 省略get和set方法}

Person person = new Person("Mr.nobody", 18, "拉斯维加斯");

并假设用户在 application.yml 配置文件中配置的前辍为 @,后辍为 %,则最终生成的字符串为:

@{"address":"拉斯维加斯","age":18,"name":"Mr.nobody"}%

首先新建一个 Maven 工程(当然也可以其他类型例如 Gradle 工程),在 pom.xml 文件中引入如下依赖。fastjson 依赖是我们业务用到将 Java 对象转换为 JSON 字符串;spring-boot-configuration-processor 依赖是可选的,加入此依赖主要是打包时,自动生成配置元信息文件 META-INF/spring-configuration-metadata.json,并放入到 jar 中。方便使用者了解到一些配置元信息。

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.nobody</groupId><artifactId>myjson-spring-boot-starter</artifactId><version>0.0.1-SNAPSHOT</version><name>myjson-spring-boot-starter</name><description>Demo project for Spring Boot Starter</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.3.8.RELEASE</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><version>2.3.8.RELEASE</version><optional>true</optional></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.73</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId><version>2.3.8.RELEASE</version></dependency></dependencies></project>

业务处理类,实现 Java 对象转换为带有指定前后缀的 JSON 字符串。

package com.nobody.myjson.service;import com.alibaba.fastjson.JSON;public class MyJsonService { // 前缀 private String prefixName; // 后缀 private String suffixName;  public String objectToMyJson(Object o) {  return prefixName + JSON.toJSONString(o) + suffixName; } public String getPrefixName() {  return prefixName; } public void setPrefixName(String prefixName) {  this.prefixName = prefixName; } public String getSuffixName() {  return suffixName; } public void setSuffixName(String suffixName) {  this.suffixName = suffixName; }}配置类,定义需要的配置信息和默认配置项,并指明关联配置文件的配置项前缀。它可以把相同前缀的配置信息通过配置项名称映射成实体类的属性中。package com.nobody.myjson.config;import org.springframework.boot.context.properties.ConfigurationProperties;@ConfigurationProperties(prefix = "nobody.json")public class MyJsonProperties { // Starter使用者没在配置文件中配置prefixName属性的值时的默认值 public static final String DEFAULT_PREFIX_NAME = "@"; // Starter使用者没在配置文件中配置suffixName属性的值时的默认值 public static final String DEFAULT_SUFFIX_NAME = "@"; private String prefixName = DEFAULT_PREFIX_NAME; private String suffixName = DEFAULT_SUFFIX_NAME; public String getPrefixName() {  return prefixName; } public void setPrefixName(String prefixName) {  this.prefixName = prefixName; } public String getSuffixName() {  return suffixName; } public void setSuffixName(String suffixName) {  this.suffixName = suffixName; }}

自动装配类,使用 @Configuration 和 @Bean 来进行自动装配,注入 Spring 容器中。

package com.nobody.myjson.config;import com.nobody.myjson.service.MyJsonService;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(MyJsonService.class) // 表示只有指定的class在classpath上时才能被注册@EnableConfigurationProperties(MyJsonProperties.class) // 激活@ConfigurationPropertiespublic class MyJsonConfiguration { private MyJsonProperties myJsonProperties; // 自动注入配置类 public MyJsonConfiguration(MyJsonProperties myJsonProperties) {  this.myJsonProperties = myJsonProperties; } // 创建MyJsonService对象,注入到Spring容器中 @Bean @ConditionalOnMissingBean(MyJsonService.class) // 当容器没有此bean时,才注册 public MyJsonService myJsonService() {  MyJsonService myJsonService = new MyJsonService();  myJsonService.setPrefixName(myJsonProperties.getPrefixName());  myJsonService.setSuffixName(myJsonProperties.getSuffixName());  return myJsonService; }}

class="lazy" data-src/main/resources/META-INF目录下新建 spring.factories 文件,输入以下内容:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.nobody.myjson.config.MyJsonConfiguration

SpringBoot 项目启动时,类加载器会从 META-INF / spring.factories 加载给定类型的工厂实现的完全限定类名。也就是说类加载器得到工程中所有 jar 包中的 META-INF/spring.factories 文件资源,从而得到了一些包括自动配置相关的类的集合,然后将它们实例化,放入 Spring 容器中。

最终项目结构如下:

怎么手写一个Spring Boot Starter

在开发工具 IDEA 通过 Maven 的 install 命令进行构建打包。或者在项目的目录下,打开命令行窗口,使用mvn install命令进行构建打包。打包后,会在工程的 target 目录下生成一个 jar 包,并且在 maven 本地仓库也会生成相应的 jar 包。

怎么手写一个Spring Boot Starter

怎么手写一个Spring Boot Starter

怎么手写一个Spring Boot Starter

怎么手写一个Spring Boot Starter

使用自定义的 Starter

经过上面几个步骤,我们自定义的 Starter 就开发好了,以下是在其他工程进行引入使用。在需要引用此 Starter 的工程的 pom.xml 文件中引入此依赖。

<dependency> <groupId>com.nobody</groupId> <artifactId>myjson-spring-boot-starter</artifactId> <version>0.0.1-SNAPSHOT</version></dependency>

刷新依赖,就能在项目的依赖库中看到此依赖了。

怎么手写一个Spring Boot Starter

展开,还能查看此 Starter 可以配置的属性项有哪些,如下:

怎么手写一个Spring Boot Starter

然后在需要用到的类中进行注入使用即可。

package com.nobody.controller;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import com.nobody.domain.Person;import com.nobody.service.MyJsonService;@RestController@RequestMapping("demo")public class DemoController {  // 注入我们Starter中的服务类 @Autowired private MyJsonService myJsonService;  @GetMapping() public String test() {  Person p = new Person("Mr.nobody", 18, "拉斯维加斯");  // 调用服务方法  return myJsonService.objectToMyJson(p); }}

启动项目,在浏览器中访问此接口,得到如下结果:

怎么手写一个Spring Boot Starter

如果我们在 application.yml 文件中添加以下配置信息,然后再访问接口的结果如下,也验证了我们可以自定义 Starter 中默认的配置项。

nobody:  json: prefixName: HH suffixName: KK

怎么手写一个Spring Boot Starter

当我们引入此 Starter 时,SpringBoot 会自动装配,将实例化的 bean 放入 Spring 容器。但我们是否可控制 bean 要不要实例化并放入容器呢?答案是可以做到的。

我们只需要在自动装配类或者类内的方法,通过 @ConditionalOnXXX 注解就能控制。例如如下所示,使用 Starter 使用者在他的项目的配置文件中填写 nobody.json.enable 的值为 false,则就不会自动生成 MyJsonService 实例了。默认不填或者 nobody.json.enable 的值为 true 时,能自动生成 bean 放入容器。这样用户就能自己控制 bean 的实例化了。

// 创建MyJsonService对象,注入到Spring容器中@Bean@ConditionalOnProperty(name = "nobody.json.enable", matchIfMissing = true)@ConditionalOnMissingBean(MyJsonService.class) // 当容器没有此bean时,才注册public MyJsonService myJsonService() { MyJsonService myJsonService = new MyJsonService(); myJsonService.setPrefixName(myJsonProperties.getPrefixName()); myJsonService.setSuffixName(myJsonProperties.getSuffixName()); return myJsonService;}

关于“怎么手写一个Spring Boot Starter”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么手写一个Spring Boot Starter

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么手写一个Spring Boot Starter

这篇文章将为大家详细讲解有关怎么手写一个Spring Boot Starter,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。何为 Starter ?想必大家都使用过 SpringBoot,在 Spring
2023-06-06

SpringBoot如何手写一个starter并使用这个starter详解

starter是SpringBoot中的一个新发明,它有效的降低了项目开发过程的复杂程度,对于简化开发操作有着非常好的效果,下面这篇文章主要给大家介绍了关于SpringBoot如何手写一个starter并使用这个starter的相关资料,需要的朋友可以参考下
2022-12-30

动态数据源dynamic-datasource-spring-boot-starter怎么使用

这篇文章主要讲解了“动态数据源dynamic-datasource-spring-boot-starter怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“动态数据源dynamic-da
2023-07-05

怎么手撸一个Spring容器

这篇文章主要介绍了怎么手撸一个Spring容器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么手撸一个Spring容器文章都会有所收获,下面我们一起来看看吧。从什么是IOC开始?Spring—&m
2023-06-29

怎么在Jenkins中部署一个Spring Boot项目

这篇文章给大家介绍怎么在Jenkins中部署一个Spring Boot项目,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。jenkins搭建 部署分为三个步骤;第一步,jenkins安装第二步,插件安装和配置第三步,Pu
2023-05-30

spring boot怎么写java web和接口

本篇内容主要讲解“spring boot怎么写java web和接口”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“spring boot怎么写java web和接口”吧!流程:Springboo
2023-06-26

怎么利用脚本部署一个Spring Boot应用

这篇文章给大家介绍怎么利用脚本部署一个Spring Boot应用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。部署方法如下:在 pom.xml 路径下新建文件 start.sh#!/bin/bash#0、删除原有的日志
2023-05-31

怎么使用JavaScript手写一个Promise

这篇文章主要介绍“怎么使用JavaScript手写一个Promise”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用JavaScript手写一个Promise”文章能帮助大家解决问题。Prom
2023-07-02

利用Spring Boot 怎么部署一个微服务项目

这篇文章将为大家详细讲解有关利用Spring Boot 怎么部署一个微服务项目,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。如果开发过spring boot的程序,应该都知道,使用sprin
2023-05-31

怎么利用Spring Boot 搭建一个微服务框架

这篇文章将为大家详细讲解有关怎么利用Spring Boot 搭建一个微服务框架,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。前言:SpringBoot是为了简化Spring应用的创建、运行、
2023-05-31

利用Spring Boot怎么实现一个表单验证功能

这期内容当中小编将会给大家带来有关利用Spring Boot怎么实现一个表单验证功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。所谓表单验证,即校验用户提交的数据的合理性的,比如是否为空了,密码长度是否
2023-05-31

在Kotlin中使用Spring Boot怎么实现一个RESTful服务

今天就跟大家聊聊有关在Kotlin中使用Spring Boot怎么实现一个RESTful服务,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Spring太复杂了,配置这个东西简直就是浪
2023-05-31

怎么在Spring Boot中使用ElasticSearch实现一个搜索引擎

这篇文章将为大家详细讲解有关怎么在Spring Boot中使用ElasticSearch实现一个搜索引擎,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Elastic Search是一个开源的
2023-05-30

利用Spring Boot怎么样实现一个图片上传功能

利用Spring Boot怎么样实现一个图片上传功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。具体内容如下package com.clou.inteface.domain.
2023-05-31

spring boot结合kaptcha怎么实现一个验证码登陆功能

本篇文章给大家分享的是有关spring boot结合kaptcha怎么实现一个验证码登陆功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。引入kaptcha所需要的jar包,我
2023-05-31

使用Spring Boot怎么样实现一个验证码生成功能

这篇文章给大家介绍使用Spring Boot怎么样实现一个验证码生成功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、验证码生成类import java.awt.*;import java.awt.image.Bu
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录