SpringBoot如何自定义starter

 更新时间:2022年01月18日 09:39:13   作者:码农洞见  
这篇文章主要介绍了SpringBoot如何自定义starter,Springboot的出现极大的简化了开发人员的配置,而这之中的一大利器便是springboot的starter,starter是springboot的核心组成部分,下面来看看集体引用过程吧

1. 什么是starter

Springboot的出现极大的简化了开发人员的配置,而这之中的一大利器便是springboot的starter,starter是springboot的核心组成部分,为什么说引入如下依赖就满足了日常web开发?

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

而不使用springboot时,需要引入spring-webspring-webmvcspring-aop等等。实际上那些必要的依赖在spring-boot-starter-web中已经被引入了,引入这个组名就引入了所有的依赖。

2. 自动配置原理

springboot在启动的时候会加载主配置类,开启了@EnableAutoConfiguration

@EnableAutoConfiguration的作用:

利用AutoConfigurationImportSelector给容器导入一些组件。
查看selectImports方法的内容,返回一个AutoConfigurationEntry
可以看到SpringFactoriesLoader.loadFactoryNames,继续看又调用了loadSpringFactories方法,获取META-INF/spring.factories资源文件。这个spring.factories文件也是一组一组的key=value的形式,其中一个key是EnableAutoConfiguration类的全类名,而它的value是一个xxxxAutoConfiguration的类名的列表,这些类名以逗号分隔,最后都加入到容器中,用来做自动配置,每一个自动配置类都可以进行自动配置功能使用HttpEncodingAutoConfiguration来解释自动装配原理。根据当前不同的条件判断,决定这个配置类是否生效!

2.1 自动配置生效

每一个XxxxAutoConfiguration自动配置类都是在某些条件之下才会生效的,这些条件的限制在Spring Boot中以注解的形式体现,

常见的条件注解有如下几项:

  • @Conditional扩展注解 作用
  • @ConditionalOnJava 系统的java版本是否符合要求
  • @ConditionalOnBean 容器中存在指定Bean
  • @ConditionalOnMissingBean 容器中不存在指定Bean
  • @ConditionalOnExpression 满足SpEL表达式
  • @ConditionalOnClass 系统中有指定的类
  • @ConditionalOnMissingClass 系统中没有指定的类
  • @ConditionalOnSingleCandidate 容器中只有一个指定的Bean,或者是首选Bean
  • @ConditionalOnProperty 系统中指定的属性是否有指定的值
  • @ConditionalOnResource 类路径下是否存在指定资源文件
  • @ConditionOnWebApplication 当前是web环境
  • @ConditionalOnNotWebApplication 当前不是web环境

自动配置原理总结如下:

  •     1、Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类进行加载
  •     2、这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置类
  •     3、自动配置类通过以Properties结尾命名的类中取得在全局配置文件中配置的属性如:server.port,而XxxxProperties类是通过@ConfigurationProperties注解与全局配置文件中对应的属性进行绑定的。

3. 自定义starter

spring-boot有两种starter:

一种是内部已经支持的,其通过@ConditionalOnClass来实决定是否例化(ConditionalOnClass是指当在classpath发现需要的依赖的类时实例化),想要启动这个服务,只要要配置上对应的starter,这个starter就能把所需要的jar给关联上。
一种是第三方的,比如mybatis等。原理是一样的,就是在你已经实现的服务代码之上封装一层配置代码就行。
基于这个机制,我们自己也可以实现一个。自定义starter,我们要做的事情是两个:确定依赖和编写自动配置。我们重点要做的就是编写自动配置,我们之前写过一些自动配置,主要是注解配置的使用,主要的注解有:

  • @Configuration :指定这个类是一个配置类
  • @ConditionalOnXXX :在指定条件成立的情况下自动配置类生效
  • @AutoConfigureAfter:指定自动配置类的顺序
  • @Bean:给容器中添加组件
  • @ConfigurationPropertie:结合相关xxxProperties类来绑定相关的配置
  • @EnableConfigurationProperties:让xxxProperties生效加入到容器中

3.1 命名规范

SpringBoot提供的starter以spring-boot-starter-xxx的方式命名的。官方建议自定义的starter使用xxx-spring-boot-starter命名规则。以区分SpringBoot生态提供的starter。

官方命名空间:

  • 前缀:“spring-boot-starter-”
  • 模式:spring-boot-starter-模块名
  • 举例:spring-boot-starter-webspring-boot-starter-jdbc

自定义命名空间:

  • 后缀:“-spring-boot-starter”
  • 模式:模块-spring-boot-starter
  • 举例:druid-spring-boot-startermybatis-spring-boot-starter

4.总结

Starter可以理解为一个可拔插式的插件,提供一系列便利的依赖描述符,您可以获得所需的所有Spring和相关技术的一站式服务。应用程序只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置。

4.1为什么要自定义starter?

在我们的日常开发工作中,经常会有一些独立于业务之外的配置模块,我们经常将其放到一个特定的包下,然后如果另一个工程需要复用这块功能的时候,需要将代码硬拷贝到另一个工程,重新集成一遍,麻烦至极。如果我们将这些可独立于业务代码之外的功能配置模块封装成一个个starter,复用的时候只需要将其在pom中引用依赖即可。

4.2 自定义starter的案例

以下案例由笔者工作中遇到的部分场景

动态数据源。 — fs-dynamic-starter
登录模块(权限)。— fs-auth-client-starter
基于AOP技术实现日志切面。—fs-common-starter
案例地址:https://gitee.com/Manoninsight/fullset/tree/master/fs-starter

这里还有一个小细节,你如果仔细查看我的案例会发下一个问题,就是我自定义的starter里并没有META-INF/spring.factories配置文件,为什么还能生效呢?这是因为我的项目用的统一的包路径:com.fs。spring配置默认会扫描当前的包路径,所以能加载到。但是笔者建议还是加上META-INF/spring.factories配置文件。

到此这篇关于SpringBoot如何自定义starter的文章就介绍到这了,更多相关SpringBoot自定义starter内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 通过Java代码技巧改善性能

    通过Java代码技巧改善性能

    在本篇文章里小编给大家分享了关于通过Java代码技巧改善性能的相关知识点,需要的朋友们参考下。
    2019-05-05
  • Java面试常考之ConcurrentHashMap多线程扩容机制详解

    Java面试常考之ConcurrentHashMap多线程扩容机制详解

    几乎所有的后端技术面试官都要在 ConcurrentHashMap 技术的使用和原理方面对小伙伴们进行刁难,本文主要来和大家聊聊ConcurrentHashMap多线程的扩容机制,希望对大家有所帮助
    2023-05-05
  • SpringMVC @RequestBody的使用解析

    SpringMVC @RequestBody的使用解析

    这篇文章主要介绍了SpringMVC @RequestBody的使用解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • SpringBoot中关于static和templates的注意事项以及webjars的配置

    SpringBoot中关于static和templates的注意事项以及webjars的配置

    今天小编就为大家分享一篇关于SpringBoot中关于static和templates的注意事项以及webjars的配置,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Java生成随机时间的简单随机算法

    Java生成随机时间的简单随机算法

    今天小编就为大家分享一篇关于Java生成随机时间的简单随机算法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Java实现线程同步方法及原理详解

    Java实现线程同步方法及原理详解

    这篇文章主要介绍了Java实现线程同步方法及原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • springboot无法从静态上下文中引用非静态变量的解决方法

    springboot无法从静态上下文中引用非静态变量的解决方法

    这篇文章主要介绍了springboot无法从静态上下文中引用非静态变量的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-06-06
  • 解决IDEA光标变成白色粗条的问题

    解决IDEA光标变成白色粗条的问题

    这篇文章主要介绍了解决IDEA光标变成白色粗条的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • java代码mqtt接收发送消息方式

    java代码mqtt接收发送消息方式

    这篇文章主要介绍了java代码mqtt接收发送消息方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 使用Jenkins配置Git+Maven的自动化构建的方法

    使用Jenkins配置Git+Maven的自动化构建的方法

    这篇文章主要介绍了使用Jenkins配置Git+Maven的自动化构建的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01

最新评论