自定义spring-boot-starter
需求背景:
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)
自定义spring-boot-starter的更多相关文章
- 年轻人的第一个自定义 Spring Boot Starter!
陆陆续续,零零散散,栈长已经写了几十篇 Spring Boot 系列文章了,其中有介绍到 Spring Boot Starters 启动器,使用的.介绍的都是第三方的 Starters ,那如何开发一 ...
- 最详细的自定义Spring Boot Starter开发教程
1. 前言 随着Spring的日渐臃肿,为了简化配置.开箱即用.快速集成,Spring Boot 横空出世. 目前已经成为 Java 目前最火热的框架了.平常我们用Spring Boot开发web应用 ...
- 自定义spring boot starter 初尝试
自定义简单spring boot starter 步骤 从几篇博客中了解了如何自定义starter,大概分为以下几个步骤: 1 引入相关依赖: 2 生成属性配置类: 3 生成核心服务类: 4 生成自动 ...
- Spring Boot(3)---自定义spring boot starter 问题
1. "Failed to process import candidates for configuration class [com.simple.....]": 主要原因: ...
- Sping Boot入门到实战之实战篇(一):实现自定义Spring Boot Starter——阿里云消息队列服务Starter
在 Sping Boot入门到实战之入门篇(四):Spring Boot自动化配置 这篇中,我们知道Spring Boot自动化配置的实现,主要由如下几部分完成: @EnableAutoConfigu ...
- 自定义 Spring Boot Starter
关于Starter Spring Boot秉承"约定大于配置"的开发方式,使得我们基于Spring Boot开发项目的效率变得十分高.相信使用过Spring Boot的小伙伴都会发 ...
- Spring Boot Starter 开发指南
Spring Boot Starter是什么? 依赖管理是任何复杂项目的关键部分.以手动的方式来实现依赖管理不太现实,你得花更多时间,同时你在项目的其他重要方面能付出的时间就会变得越少. Spring ...
- Spring Boot (一): Spring Boot starter自定义
前些日子在公司接触了spring boot和spring cloud,有感于其大大简化了spring的配置过程,十分方便使用者快速构建项目,而且拥有丰富的starter供开发者使用.但是由于其自动化配 ...
- 自定义的Spring Boot starter如何设置自动配置注解
本文首发于个人网站: 在Spring Boot实战之定制自己的starter一文最后提到,触发Spring Boot的配置过程有两种方法: spring.factories:由Spring Boot触 ...
- Spring Boot Starter自定义实现三步曲
实现自定义的spring boot starter,只需要三步: 1.一个Bean 2.一个自动配置类 3.一个META-INF/spring.factories配置文件 下面用代码演示这三步. 项目 ...
随机推荐
- c++库 c语言接口
//code in add.cxx #include "add.h" int sample::method() { cout<<"method is call ...
- KVM虚拟化平台环境部署
一:安装依赖包 二:配置网卡 三:配置环境 实验环境: KVM01 192.168.200.10 关闭防火墙及相关的安全机制 [root@KVM01 ~]# systemctl stop fire ...
- 第十二章Linux文件系统与日志
1.inode 包含文件的元信息(1)inode 内容:文件的字节数.拥有者的 UID.GID.文件的读写执行权限.时间戳等,但不包含文件名.文件名是储存在目录的目录项中.(2)查看文件的 inode ...
- VS2013 配置全局 VC++目录
原文链接:https://blog.csdn.net/humanking7/article/details/80391914 也许是我VS2013安装的有问题,每次编译程序都要去 项目属性页-> ...
- 我想solo自己一个人!
区域赛之后你就该走了,现在你告诉我,没精力不打了,我真谢谢你! 今年就TM的没有一点舒心的地方! 父母分居, 队友出走, 队伍解散, 白天家里两个外甥很吵, 鼻窦炎复发, 喜欢的妹子也追不到, 整夜失 ...
- CF--思维练习-- CodeForces - 215C - Crosses(思维题)
ACM思维题训练集合 There is a board with a grid consisting of n rows and m columns, the rows are numbered fr ...
- 单源最短路径:Dijkstra算法(堆优化)
前言:趁着对Dijkstra还有点印象,赶快写一篇笔记. 注意:本文章面向已有Dijkstra算法基础的童鞋. 简介 单源最短路径,在我的理解里就是求从一个源点(起点)到其它点的最短路径的长度. 当然 ...
- varnish 项目实战
1.工作原理 在当前主流的Web服务架构体系中,Cache担任着越来越重要的作用.常见的基于浏览器的C/S架构,Web Cache更是节约服务器资源的关键.而最近几年由FreeBSD创始人之一Kamp ...
- pycharm 新建文件后选错文件格式怎么改
经常在新建文件的时候,忘记填写文件后缀,导致文件无默认格式,而且同名字的文件怎么改都改不成想要的格式,所以随手记录一下怎么修正: 原因:肯定是pycharm已经默认指定了一个格式,所以再重复新建同样名 ...
- http抓包—Content-Type讲解
1.Content-Type的定义 Content-Type(MediaType),即是Internet Media Type,互联网媒体类型,也叫做MIME类型.在互联网中有成百上千中不同的数据类型 ...