SpringBoot手写starter全过程

 更新时间:2026年05月17日 10:23:58   作者:卧槽甜  
本文主要介绍了如何手动编写SpringBoot的starter,包括创建项目、配置自动配置类、编写Properties文件、配置spring.factories文件等步骤,并通过测试项目验证其功能,同时,还讨论了如何实现开关控制等功能

SpringBoot手写starter

相信大家在公司做项目时经常会使用到公司自己封装的依赖,里面就包括一些starter。

可以用于制成通用方法以及框架等方便维护以及后续开发。所以研究了一下如何自己去写。

先小试牛刀(在一个maven项目下快速两个创建springboot项目,一个用来写starter,一个用来测试。

至于为什么这样建是因为,写完的starter需要打包然后配置下maven私库才能跨项目使用,所以现在同一个工程里做)

首先

创建完的项目就是这样子。stater的命名是有规范的,像官方的就是把自定义名字放在最后。非官方的就是放在最前面。

先不讲springboot源码了,感兴趣的可以自己去看看。

先上代码

service

import lombok.AllArgsConstructor;

/**
 * @author xxx
 */
@AllArgsConstructor  //全参构造器
public class SplicingService {

    private  String before;

    private  String after;

    public String Splicing(String word)
    {
        return before+ word + after;
    }
}

config

import com.abc.splicingspringbootstater.Service.SplicingService;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;

/**
 * @author xxx
 * 自动配置类
 */
@Configuration   //标注为配置类 源码中可以看到 标注这个注解的类会被加载
@ConditionalOnClass(SplicingService.class)    // 该注解意思是 有“”splicingservice“”类才起作用 通俗来说就是你不注该服务类,就不会去注入下面的类
@EnableConfigurationProperties(SplicingServiceProperties.class)   //开启配置文件
public class SplicingAutoConfiguration {

    @Resource
    private SplicingServiceProperties properties;     //注入配置文件
    
    @Bean
    @ConditionalOnMissingBean()     //该注解的意思是如果没有发现service的bean就执行新建一个bean
    public SplicingService splicingService() {
        return new SplicingService(properties.getPrefix(), properties.getSuffix());
    }
}

接下来就是Properties类

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

/**
 * @author xxx
 */
@Data
@ConfigurationProperties(prefix = "splicing.service")  //读yml里的该路径
public class SplicingServiceProperties {

    private  String prefix;

    private  String suffix;
  }

然后最关键的配置文件 spring.factories

在resource下创建文件夹META-INF,在新建文件spring.factories

里面的内容就是 声明我们要自动配置的类(这些在源码中都可以看到)

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.abc.splicingspringbootstater.config.SplicingAutoConfiguration

最后就是使用test项目来测一下,首先就是在yml里写上我们的配置

splicing:
  service :
    prefix : AAA
    suffix : BBB

写一个controller 测试

import com.abc.splicingspringbootstater.Service.SplicingService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @author xxx
 */
@RestController
public class TestController {

    @Resource
    private SplicingService splicingService;

    @RequestMapping("/test")
    public String getNewChar(String word)
    {
        return splicingService.Splicing(word);
    }
}

去网页测一下可以看到结果:

大功告成,我们在拓展一下,给这个字符串拼接加一个开关enabled true的时候拼,flase就不拼

改动starter的autoconfiguration

import com.abc.splicingspringbootstater.Service.SplicingService;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;

/**
 * @author xxx
 * 自动配置类
 */
@Configuration
@ConditionalOnClass(SplicingService.class)
@EnableConfigurationProperties(SplicingServiceProperties.class)
public class SplicingAutoConfiguration {

    @Resource
    private SplicingServiceProperties properties;

    @Bean
    @ConditionalOnProperty(name = "splicing.service.enabled", havingValue = "true") // 该注解就是基于配置属性生效,处理值为“true”
    public SplicingService splicingService2() {
        return new SplicingService(properties.getPrefix(), properties.getSuffix());
    }

    @Bean
    @ConditionalOnMissingBean()
    public SplicingService splicingService() {
        return new SplicingService("", "");
    }
}

如果说这个开关新方法你写在了最开始写下面,那么一定会报错,因为会出现两个实例。

所以要把顺序调换一下,如果yml里enabled是true这样@ConditionalOnMissingBean()就会发现有实例而不在去新建,然后改一下yml再去网页试试:

splicing:
  service :
    enabled : false
    prefix : AAA
    suffix : BBB

可以看到没有拼接。

至此我们的stater就成功了。不太理解的可以去看看源码(估计也看不懂- -),之后如果自己学的更厉害了,就可以写一些框架级别的依赖文件(安全类,拦截器啥的),在去放到私库里。共勉!

项目链接:

https://github.com/ZfPx51/mystarter

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringCloud使用Feign实现动态路由操作

    SpringCloud使用Feign实现动态路由操作

    这篇文章主要介绍了SpringCloud使用Feign实现动态路由操作,文章围绕主题展开详细的内容介绍具有一定的参考价值,需要的小伙伴可以参考一下
    2022-06-06
  • Java中ArrayList的8种浅拷贝方式示例代码

    Java中ArrayList的8种浅拷贝方式示例代码

    这篇文章主要介绍了Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅拷贝的方法,可以帮助读者更好地理解和选择合适的浅拷贝方法,需要的朋友可以参考下
    2025-01-01
  • spring IOC中三种依赖注入方式

    spring IOC中三种依赖注入方式

    这篇文章主要介绍了spring IOC中三种依赖注入方式,Spring使用注入方式,为什么使用注入方式,这系列问题实际归结起来就是一句话,Spring的注入和IoC(本人关于IoC的阐述)反转控制是一回事
    2021-08-08
  • 关于Springboot的扩展点DisposableBean的原理解析

    关于Springboot的扩展点DisposableBean的原理解析

    这篇文章主要介绍了关于Springboot的扩展点DisposableBean的原理解析,DisposableBean是一个接口,为Spring bean提供了一种释放资源的方式 ,只有一个扩展方法destroy(),需要的朋友可以参考下
    2023-05-05
  • java进行数据的比较的实例方法

    java进行数据的比较的实例方法

    在本篇文章里小编给大家整理的是一篇关于java进行数据的比较的实例方法,有需要的朋友们可以学习下。
    2021-04-04
  • IDEA去除掉代码中虚线、波浪线和下划线实线的方法

    IDEA去除掉代码中虚线、波浪线和下划线实线的方法

    初次安装使用IDEA,总是能看到导入代码后,出现很多的波浪线,下划线和虚线,这是IDEA给我们的一些提示和警告,但是有时候我们并不需要,反而会让人看着很不爽,这里简单记录一下自己的调整方法,供其他的小伙伴在使用的时候参考
    2024-09-09
  • java中的 HashMap 的加载因子是0.75原理探讨

    java中的 HashMap 的加载因子是0.75原理探讨

    在Java中,HashMap是一种常用的数据结构,用于存储键值对,它的设计目标是提供高效的插入、查找和删除操作,在HashMap的实现中,加载因子(Load Factor)是一个重要的概念,本文将探讨为什么Java中的HashMap的加载因子被设置为0.75
    2023-10-10
  • springboot+hutool批量生成二维码压缩导出功能

    springboot+hutool批量生成二维码压缩导出功能

    这篇文章主要介绍了springboot+hutool批量生成二维码压缩导出功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • javaCV开发详解之推流器和录制器的实现

    javaCV开发详解之推流器和录制器的实现

    这篇文章主要介绍了javaCV开发详解之推流器和录制器实现,对JavaCV感兴趣的同学,可以参考下
    2021-04-04
  • Java利用三目运算符比较三个数字的大小

    Java利用三目运算符比较三个数字的大小

    今天小编就为大家分享一篇关于Java利用三目运算符比较三个数字的大小,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12

最新评论