SpringBoot如何自定义starter

目录
  • 1. 什么是starter
  • 2. 自动配置原理
    • 2.1 自动配置生效
  • 3. 自定义starter
    • 3.1 命名规范
  • 4.总结
    • 4.1为什么要自定义starter?
    • 4.2 自定义starter的案例

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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot自动配置之自定义starter的实现代码

    前言:前面已经介绍了自动配置的很多原理,现在我们着手自己定义一个starter. 需求:自定义redis-starter,要求当导入redis坐标后,SpringBoot自动创建Jedis的Bean.正式开始之前,我们可以查看Mybatis的起步依赖是如果实现自动配置的.我这里就省略了,大家根据之前的分析文章,自己看源码即可. 一.先创建一个SpringBoot工程redis-spring-boot-autoconfigure,该工程中添加jedis依赖,并且创建一个自动配置类RedisAuto

  • 使用SpringBoot自定义starter详解

    一.新建一个工程 工程由xxx-sprig-boot-starter和xxx-sprig-boot-starter-configure两个模块组成: xxx-sprig-boot-starter模块 只用来做依赖导入 依赖于 xxx-sprig-boot-starter-configure模块,没有实际代码 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave

  • 使用SpringBoot自定义starter的完整步骤

    前言 使用过SpringBoot的都应该知道,一个SpringBoot 项目就是由一个一个 Starter 组成的,一个 Starter 代表该项目的 SpringBoot 启动依赖,除了官方已有的 Starter,我们可以根据自己的需要自定义新的Starter. 一.自定义SpringBoot Starter 自定义Starter,首选需要实现自动化配置,而要实现自动化配置需要满足以下两个条件: (1)能够自动配置项目所需要的配置信息,也就是自动加载依赖环境: (2)能够根据项目提供的信息自动

  • Java SpringBoot自定义starter详解

    目录 一.什么是SpringBoot starter机制 二.为什么要自定义starter ? 三.什么时候需要创建自定义starter? 四.自定义starter的开发流程(案例:为短信发送功能创建一个starter) 1.细节:命名规范 2.必须引入的依赖 3.编写相关属性类(XxxProperties):例如 SmsProperties.java 4.编写Starter项目的业务功能 5.编写自动配置类AutoConfig 6.编写spring.factories文件加载自动配置类 7.打

  • springboot自定义starter启动器的具体使用实践

    目录 第一步.创建 xxx-spring-boot-starter 的spring Initializr模块 第二步.删除不需要的内容(启动类.除下面spring-boot-starter的其它依赖,maven编译插件) 第三步.写代码,对外提供一些自己写的类 第四步.在resources资源文件夹下创建一个META-INF文件夹,并创建一个spring.factories文件 第五步.将该项目发布的maven仓库,或者安装到本地仓库中让其它项目能使用的到 第六步.测试自己定义的启动器使用有效

  • 详解SpringBoot如何自定义Starter

    目录 阅读收获 本章源码下载 什么是Starter 为什么使用Starter Springboot自动配置 spring.factories Starter开发常用注解 Full全模式和Lite轻量级模式 Starter命名规范 开发Starter 1. 创建Starter项目 2. 添加依赖 3. 编写属性类 4. 自定义业务类 5. 编写自动配置类 6. 编写spring.factories 7. 编写配置提示文件(非必须) 测试Starter 1. 前置环境 2. 添加依赖 3. 测试类

  • 浅谈SpringBoot如何自定义Starters

    一.Starters原理 1.1 Starters场景启动器 1.场景需要用到的依赖是什么? 比如依赖的jar 2.如何编写自动配置? 以WebMvcAutoConfiguration自动配置为例: @Configuration @ConditionalOnWebApplication @ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurerAdapter.class }) @Conditiona

  • SpringBoot如何自定义starter

    目录 1. 什么是starter 2. 自动配置原理 2.1 自动配置生效 3. 自定义starter 3.1 命名规范 4.总结 4.1为什么要自定义starter? 4.2 自定义starter的案例 1. 什么是starter Springboot的出现极大的简化了开发人员的配置,而这之中的一大利器便是springboot的starter,starter是springboot的核心组成部分,为什么说引入如下依赖就满足了日常web开发? <dependency>   <groupId

  • SpringBoot自定义starter启动器的实现思路

    目录 一.引言 二. 需求说明 三. 设计思路 四. 实现步骤 1. Step1 业务定义 2. Step2 自动配置 2.1 HelloService类 2.2 HelloProperties类 2.3 HelloServiceAutoConfiguration类 3. Step3 工厂文件 4. Step4 安装 5. Step5 引入使用 5.1 在应用中添加自定义starter依赖坐标 5.2 编写配置信息 5.3 编写测试的Controller 5.4 打开浏览器输入Controlle

  • springboot自定义Starter的具体流程

    自定义Starter命名规则 注意artifactId的命名规则,Spring官方Starter通常命名为spring-boot-starter-{name}如 spring-boot-starter-web, Spring官方建议非官方Starter命名应遵循{name}-spring-boot-starter的格式, 如mybatis-spring-boot-starter.这里创建的项目的artifactId为helloworld-spring-boot-starter 开发Starter

  • springboot自定义Starter过程解析

    自定义Starter命名规则 注意artifactId的命名规则,Spring官方Starter通常命名为spring-boot-starter-{name}如 spring-boot-starter-web, Spring官方建议非官方Starter命名应遵循{name}-spring-boot-starter的格式, 如mybatis-spring-boot-starter.这里创建的项目的artifactId为helloworld-spring-boot-starter 开发Starter

  • SpringBoot自定义starter实例代码

    一.简介 SpringBoot 最强大的功能就是把我们常用的场景抽取成了一个个starter(场景启动器),我们通过引入SpringBoot 为我提供的这些场景启动器,我们再进行少量的配置就能使用相应的功能.即使是这样,SpringBoot也不能囊括我们所有的使用场景,往往我们需要自定义starter,来简化我们对SpringBoot的使用. 下面话不多说了,来一起看看详细的介绍吧 二.如何自定义starter 1.实例 如何编写自动配置 ? 我们参照@WebMvcAutoConfigurati

  • springboot自定义starter实现过程图解

    这篇文章主要介绍了springboot自定义starter实现过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.创建一个Empty Project 2.在该工程中点击+,选择new module,新建一个maven工程 点击确定. 3.在该工程中点击+,选择new module,新建一个Spring Initializr工程 后面直接默认next,然后点击finishi. 两个都创建完毕之后点击apply,点击OK.得到如下结构: 4

随机推荐