需求背景:

  Springboot是Spring旗下优秀的子项目之一,其核心理念之一:约定优于配置。通过自动化的配置极大的提升了我们的开发效率,目前已集成诸多组件的starter起步依赖,帮助我们更加快速的构建标准化的应用。

   starter作为springboot的一大特色,作为自动配置的核心组成,包括的优点如下:

    快速创建独立运行的Spring项目以及与主流框架集成;

    使用嵌入式的Servlet容器,应用无需打成WAR包;

    starters自动依赖与版本控制;

    大量的自动配置,简化开发,也可修改默认值;

    无需配置XML,无代码生成,开箱即用;

    准生产环境的运行时应用监控;

    与云计算的天然集成;

Springboot支持自定义的starter,在开发过程中,我们若有一系列初始化配置需要在spring容器启动时完成初始化,此时我们可以把这批操作封装为一个starter,在目标项目中通过maven坐标引入。starter依赖于宿主项目的spring上下文环境,与我们传统方式在spring项目中注入bean不同,它本身可以独立开发,并打包引入到spring应用中。

原理

  在springboot应用开发中,当我们在pom文件中引入starter组件依赖坐标时,启动Spring容器,此时应用会去依赖的Starter包中查找resources/META-INF/spring.factories文件,根据文件中配置去加载相应的自动配置类,类似于Java的SPI机制。简单的说自动配置是根据约定来的,也就是说springboot要求必须按照他给的规则开发starter才会帮你自动配置。
大致思路:

  1.查找 spring.factories 中配置加载 AutoConfigure 类

  2.根据目标配置类的@Condition注解条件,将相应的配置bean注入到当前spring Context上下文环境中。也可以通过@EnableConfigurationProperties将指定配置类加载进来

代码实现

1.编写自己的starter,建立springboot项目,应用名demo-springboot-starter,添加maven坐标如下:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>

2.编写Service

  主要实现该Starter主要实现的业务逻辑,这里是将配置文件中的配置加载进来,然后根据特定符号进行分割

/**
* 编写配置业务类
*
* @author jiayuan9608@163.com
* @version 1.0.0
* @date 2019/5/22 10:34
*/
public class StarterService { private String config; public StarterService(String config) {
this.config = config;
} public String[] split(String separatorChar) {
return StringUtils.split(this.config, separatorChar);
}
}

3.配置文件读取类

/**
* 配置文件读取类
*
* @author jiayuan9608@163.com
* @version 1.0.0
* @date 2019/5/22 10:38
*/
@ConfigurationProperties("cn.jyycode.service")
@Data
public class StarterServiceProperties { private String config;
}

4.编写AutoConfigure类,这是starter启动时加载spring.factories指定的启动配置类

/**
* Starter启动自动配置类
*
* @author jiayuan9608@163.com
* @version 1.0.0
* @date 2019/5/22 10:43
*/
@Configuration
@ConditionalOnClass(StarterService.class)
@EnableConfigurationProperties(StarterServiceProperties.class)
public class StarterAutoConfigure { @Autowired
private StarterServiceProperties properties; @Bean
@ConditionalOnMissingBean(StarterService.class)
public StarterService starterService(){
System.out.println("demo-spring-boot-starter run success:"+properties.getConfig());
return new StarterService(properties.getConfig());
}

本类中使用了@Conditional注解,它是Spring4提供的一个新特性,用于根据特定条件来控制bean的创建行为。主要包括:

@ConditionalOnBean:仅在当前上下文中存在某个bean时,才会实例化这个Bean
@ConditionalOnClass:某个class位于类路径上,才会实例化这个Bean
@ConditionalOnExpression:当表达式为true的时候,才会实例化这个Bean
@ConditionalOnJava:基于JVM版本作为判断条件
@ConditionalOnJndi:在JNDI存在的条件下查找指定的位置
@ConditionalOnMissingBean:仅在当前上下文中不存在某个bean时,才会实例化这个Bean。
@ConditionalOnMissingClass:某个class在类路径上不存在的时候,才会实例化这个Bean。
@ConditionalOnNotWebApplication:不是web应用时才会实例化这个Bean
@ConditionalOnProperty:指定的属性是否有指定的值
@ConditionalOnResource:类路径下是否有指定的资源
@ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个,或者在有多个Bean的情况下,用来指定首选的Bean
@ConditionalOnWebApplication:当前项目是Web项目的条件下

@AutoConfigureAfter,在某个bean完成自动配置后实例化这个bean。

@AutoConfigureBefore,在某个bean完成自动配置前实例化这个bean

 

5.在resources/META-INF/下创建spring.factoris文件,添加内容:(factories文件为k-v格式,v可以有多个,用 \ 号分隔,v值根据自己的实际配置类路径)

org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.jyycode.config.StarterAutoConfigure

6.打包发布自己的Starter

  在idea或当前项目根目录下打开终端,执行mvn clean install -U,将项目打包并安装到本地maven仓库中去

7.新建新项目demo,引入demo-springboot-starter坐标依赖

<dependency>
<groupId>cn.jyycode</groupId>
<artifactId>demo-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>

8.有个小坑

  在starter项目进行maven打包时,注意在pom中插件添加如下配置:configuration.skip=true。否则在打包时会在class目录下生成BOOT-INF文件夹,导致spring.factories中配置的类无法找到,导致整个spring应用启动失败。

<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>

案例截图:(1)

参考文档:(1)https://blog.csdn.net/iME_cho/article/details/105528208?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158927439419195239839421%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=158927439419195239839421&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-2-105528208.nonecase&utm_term=%E8%87%AA%E5%AE%9A%E4%B9%89spring-boot-starter

(2)https://blog.csdn.net/zhang_jiayuan/article/details/90543747?ops_request_misc=&request_id=&biz_id=102&utm_term=%E8%87%AA%E5%AE%9A%E4%B9%89spring-boot-starter&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-90543747

(3)https://blog.csdn.net/yb223731/article/details/86524797?ops_request_misc=&request_id=&biz_id=102&utm_term=%E8%87%AA%E5%AE%9A%E4%B9%89spring-boot-starter&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-3-86524797

(4)https://blog.csdn.net/wangpengzhi19891223/article/details/83055725?ops_request_misc=&request_id=&biz_id=102&utm_term=%E8%87%AA%E5%AE%9A%E4%B9%89spring-boot-starter&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-4-83055725

自定义spring-boot-starter的更多相关文章

  1. 年轻人的第一个自定义 Spring Boot Starter!

    陆陆续续,零零散散,栈长已经写了几十篇 Spring Boot 系列文章了,其中有介绍到 Spring Boot Starters 启动器,使用的.介绍的都是第三方的 Starters ,那如何开发一 ...

  2. 最详细的自定义Spring Boot Starter开发教程

    1. 前言 随着Spring的日渐臃肿,为了简化配置.开箱即用.快速集成,Spring Boot 横空出世. 目前已经成为 Java 目前最火热的框架了.平常我们用Spring Boot开发web应用 ...

  3. 自定义spring boot starter 初尝试

    自定义简单spring boot starter 步骤 从几篇博客中了解了如何自定义starter,大概分为以下几个步骤: 1 引入相关依赖: 2 生成属性配置类: 3 生成核心服务类: 4 生成自动 ...

  4. Spring Boot(3)---自定义spring boot starter 问题

    1. "Failed to process import candidates for configuration class [com.simple.....]": 主要原因: ...

  5. Sping Boot入门到实战之实战篇(一):实现自定义Spring Boot Starter——阿里云消息队列服务Starter

    在 Sping Boot入门到实战之入门篇(四):Spring Boot自动化配置 这篇中,我们知道Spring Boot自动化配置的实现,主要由如下几部分完成: @EnableAutoConfigu ...

  6. 自定义 Spring Boot Starter

    关于Starter Spring Boot秉承"约定大于配置"的开发方式,使得我们基于Spring Boot开发项目的效率变得十分高.相信使用过Spring Boot的小伙伴都会发 ...

  7. Spring Boot Starter 开发指南

    Spring Boot Starter是什么? 依赖管理是任何复杂项目的关键部分.以手动的方式来实现依赖管理不太现实,你得花更多时间,同时你在项目的其他重要方面能付出的时间就会变得越少. Spring ...

  8. Spring Boot (一): Spring Boot starter自定义

    前些日子在公司接触了spring boot和spring cloud,有感于其大大简化了spring的配置过程,十分方便使用者快速构建项目,而且拥有丰富的starter供开发者使用.但是由于其自动化配 ...

  9. 自定义的Spring Boot starter如何设置自动配置注解

    本文首发于个人网站: 在Spring Boot实战之定制自己的starter一文最后提到,触发Spring Boot的配置过程有两种方法: spring.factories:由Spring Boot触 ...

  10. Spring Boot Starter自定义实现三步曲

    实现自定义的spring boot starter,只需要三步: 1.一个Bean 2.一个自动配置类 3.一个META-INF/spring.factories配置文件 下面用代码演示这三步. 项目 ...

随机推荐

  1. c++库 c语言接口

    //code in add.cxx #include "add.h" int sample::method() { cout<<"method is call ...

  2. KVM虚拟化平台环境部署

    一:安装依赖包 二:配置网卡 三:配置环境 实验环境: KVM01   192.168.200.10 关闭防火墙及相关的安全机制 [root@KVM01 ~]# systemctl stop fire ...

  3. 第十二章Linux文件系统与日志

    1.inode 包含文件的元信息(1)inode 内容:文件的字节数.拥有者的 UID.GID.文件的读写执行权限.时间戳等,但不包含文件名.文件名是储存在目录的目录项中.(2)查看文件的 inode ...

  4. VS2013 配置全局 VC++目录

    原文链接:https://blog.csdn.net/humanking7/article/details/80391914 也许是我VS2013安装的有问题,每次编译程序都要去 项目属性页-> ...

  5. 我想solo自己一个人!

    区域赛之后你就该走了,现在你告诉我,没精力不打了,我真谢谢你! 今年就TM的没有一点舒心的地方! 父母分居, 队友出走, 队伍解散, 白天家里两个外甥很吵, 鼻窦炎复发, 喜欢的妹子也追不到, 整夜失 ...

  6. CF--思维练习-- CodeForces - 215C - Crosses(思维题)

    ACM思维题训练集合 There is a board with a grid consisting of n rows and m columns, the rows are numbered fr ...

  7. 单源最短路径:Dijkstra算法(堆优化)

    前言:趁着对Dijkstra还有点印象,赶快写一篇笔记. 注意:本文章面向已有Dijkstra算法基础的童鞋. 简介 单源最短路径,在我的理解里就是求从一个源点(起点)到其它点的最短路径的长度. 当然 ...

  8. varnish 项目实战

    1.工作原理 在当前主流的Web服务架构体系中,Cache担任着越来越重要的作用.常见的基于浏览器的C/S架构,Web Cache更是节约服务器资源的关键.而最近几年由FreeBSD创始人之一Kamp ...

  9. pycharm 新建文件后选错文件格式怎么改

    经常在新建文件的时候,忘记填写文件后缀,导致文件无默认格式,而且同名字的文件怎么改都改不成想要的格式,所以随手记录一下怎么修正: 原因:肯定是pycharm已经默认指定了一个格式,所以再重复新建同样名 ...

  10. http抓包—Content-Type讲解

    1.Content-Type的定义 Content-Type(MediaType),即是Internet Media Type,互联网媒体类型,也叫做MIME类型.在互联网中有成百上千中不同的数据类型 ...