架构师必备:如何基于springboot的自定义starter

基本介绍

在我们平时的Springboot应用程序开发中,我们经常把我们需要的starter引入,这样程序启动时就会把这个starter的相关功能自动配置到spring的应用程序容器中
,可以极大地简化我们的Spring应用程序开发和配置过程。

比如spring-boot-starter-web这个starter我们应该都很熟悉,通过引入这个starter我们程序就已经有了web服务器、springmvc等基本能力;
相较于传统的非springboot的web开发免去了引入相关依赖并编写众多配置文件的令人头疼的过程。

原理分析

SPI机制

SPI(Service Provider Interface),springboot的一种服务发现机制规范。具体实现形式是通过在项目resources里添加的spring.factories文件来指定
需要扫描的配置类去初始化到容器里。

扫描流程

  • 1、使用SpringApplication启动springboot程序
    SpringApplication.run(YeeeAppBootstrapApplication.class, args);
  • 2、程序启动过程中,会调用到spring的AbstractApplicationContext刷新上下文,这个过程中会涉及到BeanDefinitions的定义及初始化
    refreshContext(ConfigurableApplicationContext context)
  • 3、在refresh过程中,会有专门的ConfigPostProcessors来读取classes/META-INF/spring.factories文件中以EnableAutoConfiguration类标识的所有需要扫码的配置类
    ,将其注册到BeanDefinitions中
    ...
    invokeBeanFactoryPostProcessors(beanFactory);
    ...
    // 读取spring.factories文件中以EnableAutoConfiguration类标识的所有需要扫码的配置类
    List<String> configurations = SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class);
    ...
    // 注册到BeanFactory的beanDefinitionNames中
    processConfigBeanDefinitions(BeanDefinitionRegistry registry)
    ...
  • 4、refresh最后就是BeanDefinitions的初始化了。
  finishBeanFactoryInitialization(beanFactory);

怎么构建自定义的starter?

案例:swagger2的公共starter

场景描述

在我们项目开发中swagger显然已经必不可少,在没有构建公共的starter后,我们每次使用swagger都需要引入许多依赖并且
还得写一些额外的配置类来初始化它;在封装成starter后我们只需要在pom中引入这个starter并且不需要额外配置就可以拥有这个功能。

具体构建过程
  • 1、新建maven项目base-swagger,并且在/src/main/resources中新增文件夹METAINF,然后在METAINF中增加spring.factories文件

在这里插入图片描述

  • 2、编写swagger相关的配置类

在这里插入图片描述

  • 3、编写主配置类,并把全路径名写到spring.factories中
@ComponentScan({"vip.yeee.memo.base.swagger.config", "springfox.documentation.schema"})
public class SwaggerAutoConfigure {
    
    public SwaggerAutoConfigure() {
        log.info("自动配置-swagger");
    }
}

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
        vip.yeee.memo.base.swagger.SwaggerAutoConfigure
  • 4、在需要使用swagger的项目pom中引入该starter
<dependency>
    <groupId>vip.yeee.memo</groupId>
    <artifactId>base-swagger</artifactId>
</dependency>
  • Github详细代码

// 1.自定义starter项目
https://gitee.com/yeeevip/yeee-memo/tree/master/memo-parent/memo-base/base-swagger

版权 本文为yeee.vip原创文章,转载无需和我联系,但请注明来自https://www.yeee.vip

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wwwyeeevip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值