前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >架构师必备:如何基于springboot优雅的构建公共的starter

架构师必备:如何基于springboot优雅的构建公共的starter

原创
作者头像
用户2031163
发布2023-08-27 16:27:12
2110
发布2023-08-27 16:27:12
举报

基本介绍

在我们平时的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程序
代码语言:javascript
复制
    SpringApplication.run(YeeeAppBootstrapApplication.class, args);
  • 2、程序启动过程中,会调用到spring的AbstractApplicationContext刷新上下文,这个过程中会涉及到BeanDefinitions的定义及初始化
代码语言:javascript
复制
    refreshContext(ConfigurableApplicationContext context)
  • 3、在refresh过程中,会有专门的ConfigPostProcessors来读取classes/META-INF/spring.factories文件中以EnableAutoConfiguration类标识的所有需要扫码的配置类 ,将其注册到BeanDefinitions中
代码语言:javascript
复制
    ...
    invokeBeanFactoryPostProcessors(beanFactory);
    ...
    // 读取spring.factories文件中以EnableAutoConfiguration类标识的所有需要扫码的配置类
    List<String> configurations = SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class);
    ...
    // 注册到BeanFactory的beanDefinitionNames中
    processConfigBeanDefinitions(BeanDefinitionRegistry registry)
    ...
  • 4、refresh最后就是BeanDefinitions的初始化了。
代码语言:javascript
复制
  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中
代码语言:javascript
复制
@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
代码语言:javascript
复制
<dependency>
    <groupId>vip.yeee.memo</groupId>
    <artifactId>base-swagger</artifactId>
</dependency>
  • Github详细代码
代码语言:javascript
复制
// 1.自定义starter项目
https://github.com/yeeevip/yeee-memo/tree/master/memo-parent/memo-base/base-swagger

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基本介绍
  • 原理分析
    • SPI机制
      • 扫描流程
      • 怎么构建自定义的starter?
        • 案例:swagger2的公共starter
          • 场景描述
          • 具体构建过程
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档