SpringBoot自定义Starter(自动配置类)

前言

SpringBoot其实从诞生以来围绕的核心就是快速构建项目,快速构建的前提是有人帮你做好轮子,开发者只要拿来即用就好了,而造好轮子的人就是SpringBoot的开发者,引入自动配置的形式帮助开发者快速创建项目,而自动配置采用的是一种starter模块形式,比如web模块就引入spring-boot-starter-web。而且SpringBoot依旧支持第三方组件融入到SpringBoot的生态圈中,比如Mybatis的组件模块名:mybatis-spring-boot-starter。今天就来分享一下第三方组件是如何引入SpringBoot里面来的。

介绍

自定义starter看懂了之后其实也不是很难,就拿最近我的一个开源框架做示例吧,正好也要开发一个支持SpringBoot的小功能。

iagent:一个采用接口动态代理的形式封装HTTP请求小组件(快速跳转),不过最近打算重构了。

本想着开发这个就是能够在项目中统一一下调用其他厂商HTTP的接口,免得太乱的本质想法开发的,但是自从我接触到微服务之后才发现原来有个Ribbon + Fegin框架,只能说博主的老东家太过传统,自身接触不到这块的东西。

创建

首先需要引入SpringBoot自动配置组件

spring-boot-autoconfigure:自定义starter必备引入jar包

spring-boot-configuration-processor:该组件是用来在properties或者yml文件当中给予提示的。

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

然后需要一个对应的实体类用来保存properties或yml文件中的环境变量,使用@ConfigurationProperties映射前缀

 然后还需要一个自动配置的类

 一般自动配置类命名方式为 XXXXAutoConfiguration 表示改类为自动配置类

@Configuration:这个注解不多介绍了,就是表示为配置类

@EnableConfigurationProperties:该注解是用来开启配置参数的注解的,将配置文件中的变量加载到Properties的配置类对象当中,并注入到容器当中

并且SpringBoot还提供了一些@Conditional注解:

@ConditionalOnBean:当SpringIoc容器内存在指定Bean的条件
@ConditionalOnClass:当SpringIoc容器内存在指定Class的条件
@ConditionalOnExpression:基于SpEL表达式作为判断条件
@ConditionalOnJava:基于JVM版本作为判断条件
@ConditionalOnMissingBean:当SpringIoc容器内不存在指定Bean的条件
@ConditionalOnMissingClass:当SpringIoc容器内不存在指定Class的条件
@ConditionalOnNotWebApplication:当前项目不是Web项目的条件
@ConditionalOnProperty:指定的属性是否有指定的值
@ConditionalOnResource:类路径是否有指定的值
@ConditionalOnSingleCandidate:当指定Bean在SpringIoc容器内只有一个,或者虽然有多个但是指定首选的Bean
@ConditionalOnWebApplication:当前项目是Web项目的条件以上注解都是元注解@Conditional演变而来的,根据不用的条件对应创建以上的具体条件注解。

接下来就是加载配置文件了,根据SpringBoot的自动配置原理,SpringBoot会自动加载META-INF/spring.factories文件中的数据

所以还需要加一个配置,这样SpringBoot才能扫描到这个自动配置类。

 

org.springframework.boot.autoconfigure.EnableAutoConfiguration表示自动配置类。

这样自定义starter就好了,我们可以写个测试用例试一下。

说明自定义starter已经开发好啦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/537091.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java并发编程之synchronized关键字解析

前言 公司加班太狠了&#xff0c;都没啥时间充电&#xff0c;这周终于结束了。这次整理了Java并发编程里面的synchronized关键字&#xff0c;又称为隐式锁&#xff0c;与JUC包中的Lock显示锁相对应&#xff1b;这个关键字从Java诞生开始就有&#xff0c;称之为重量级锁&#xf…

raidrive安装失败_记一次RaiDrive映射OneDrive遇到的问题

大概在1周以前&#xff0c;出于需要存放直播录像的原因&#xff0c;根据别人的视频教程去自己动手搞了个5T网盘的帐号。(体验一下&#xff0c;其实我还同时存一份在百度云&#xff0c;怕不稳定)用RaiDrive创建OneDrive的映射&#xff0c;在这步骤点确定后&#xff0c;会弹出微软…

通过代理模式 + 责任链模式实现对目标执行方法拦截和增强功能

前言 最近需要实现一个插件功能&#xff0c;但是如果做成两个接口的话&#xff08;即执行前和执行后&#xff09;&#xff0c;那么会降低插件的可玩性&#xff0c;所以需做成类似AOP的环绕通知形式&#xff0c;所以就使用到了责任链模式和代理模式进行实现。 介绍 代理模式(P…

Javascript基础之-原型(prototype)

首先呢&#xff0c;prototype是对象里的一个内置属性&#xff0c;并且呢&#xff0c;这个属性是对于其他对象的一个引用。所以呢&#xff0c;思考下面的例子&#xff1a; var obj {a: 2 } var myObj Object.create(obj); console.log(myObj.a); // 2 console.log(myObj obj)…

Oracle查询今天、昨天、本周、上周、本月、上月数据

查询今天数据&#xff1a; SELECT COUNT(1) FROM T_CALL_RECORDS WHERE TO_CHAR(T_RKSJ,YYYY-MM-DD)TO_CHAR(SYSDATE,YYYY-MM-DD)&#xff1b; 查询昨天数据&#xff1a; SELECT COUNT(1) FROM T_CALL_RECORDS WHERE TO_CHAR(T_RKSJ,YYYY-MM-DD)TO_CHAR(SYSDATE-1,YYYY-MM-DD)&…

usb一转多 树莓派zero_树莓派 Zero USB/以太网方式连接配置教程

树莓派 Zero 之所以成为一款非常棒的单板计算机并不全因为它小巧的尺寸和便宜的价格&#xff0c;还得益于它便捷、易用的特性。在加装了 Zero Quick Plug 或 microUSB/USB 转换头之后&#xff0c;将树莓派 Zero 和电脑连接起来。树莓派 Zero 即可配置成 USB/以太网设备&#xf…

vscode Go 1.11.4 编译错误 need Delve built by Go 1.11 or later

更新golang的版本为1.11.4之后vscode编译错误&#xff1a;executables built by Go 1.11 or later need Delve built by Go 1.11 or later 原因是delve的版本太老了&#xff0c;需要更新&#xff0c;且delve的github地址已经更换&#xff0c;很多教程里的地址是不对的 新地址安…

oppo的sd卡在哪里打开_oppo的sd卡在哪里打开

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。以oppo A91为例&#xff0c;其sd卡可直接在文件管理页面的存储里面即可打开。OPPO A91的屏幕为6.4英寸&#xff0c;主屏分辨率2400乘以1080像素&#xff0c;机身颜色有暗夜星辰&…

Navicat使用教程:使用Navicat Query Analyzer优化查询性能(第1部分)

下载Navicat Monitor最新版本Navicat Monitor 是一套安全、简单而且无代理的远程服务器监控工具。它具有强大的功能使你的监控发挥最大效用。受监控的服务器包括 MySQL、MariaDB 和 Percona Server&#xff0c;并与 Amazon RDS、Amazon Aurora、Oracle Cloud、Microsoft Azure …

dg oracle 切换模式_Oracle数据库 DGbroker三种保护模式的切换

1.三种保护模式– Maximum protection在Maximum protection下&#xff0c; 可以保证从库和主库数据完全一样&#xff0c;做到zero data loss.事务同时在主从两边提交完成&#xff0c;才算事务完成。如果从库宕机或者网络出现问题&#xff0c;主从库不能通讯&#xff0c;主库也立…

软件包管理

应用程序&#xff1a;程序&#xff1a;Architecture C语言&#xff1a;源代码-->&#xff08;编译&#xff09; 二进制格式脚本&#xff1a;解释器&#xff08;二进制程序&#xff09; 源代码-->编译-->链接-->运行程序&#xff1a;指令数据指令&#xff1a;芯片CP…

工业机器人码垛教学实施_工业机器人应用案例码垛详解

工业机器人应用案例码垛详解随着科技的进步以及现代化进程的加快&#xff0c;人们对搬运速度的要求越来越高&#xff0c;传统的人工码垛只能应用在物料轻便、尺寸和形状变化大、吞吐量小的场合&#xff0c;这已经远远不能满足工业的需求&#xff0c;机器人码垛机应运而生。机器…

第一家云创大数据产业学院在佛山职业技术学院挂牌

2019年1月10日&#xff0c;“云创大数据产业学院揭牌暨战略合作协议签署仪式”在佛山职业技术学院电子信息学院会议室举行。云创大数据总裁刘鹏教授、市场部经理单明月&#xff0c;佛山职业技术学院电子信息学院院长唐建生、副院长田钧、学院办公室主任赵雪章、信息工程系主任乔…

String与StringBuffer和StringBuilder的根本区别

*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程 请关注微信公众号:HB荷包 一个能让你学习技术和赚钱方法的公众号,持续更…

16进制 ksh_AIX系统中如何统计进程打开的文件数目

作者&#xff1a;李烨楠 中国建设银行来自微信公众号&#xff1a;平台人生环境: AIX 6.1 AIX7.1前言:用户有时需要统计一个进程打开的文件数目&#xff0c;比如&#xff0c;在当前打开文件句柄使用量是否超过用户资源限制(/etc/security/limits)中 nofiles的取值时。那么&#…

前端Http协议缓存初解

[TOC] 简介 用户获取网络资源&#xff0c;需要通过非常长的网络去服务器上请求资源,另外服务端为了应对大量的用户请求而不断的提升硬件性能与带宽。这对用户与服务端都非常的不友好。而缓存就是为了解决用户请求速度与释放服务器压力而生的。 为什么我会写Http缓存&#xff0c…

详解java访问修饰符

*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程 请关注微信公众号:HB荷包 一个能让你学习技术和赚钱方法的公众号,持续更…

educoder 二进制数据的位运算_二进制与位运算实用操作汇总(基础篇)

位运算是最高效而且占用内存最少的算法操作&#xff0c;但也是最难看懂的操作。然而&#xff0c;关于位运算的用法&#xff0c;笔者查了许多资料&#xff0c;似乎都没有找到详细而系统的讲解资料。笔者对位运算的操作相当感兴趣&#xff0c;因此斗胆尝试对位运算来一个的总结。…

企业为什么要做SEO,它的重要性有哪些?

对于SEO工作而言&#xff0c;我们知道一个网站做SEO的基础诉求就是让用户和搜索引擎更好的理解网站内容&#xff0c;虽然随着搜索引擎算法技术的迭代&#xff0c;目前SEO面临更大的挑战与竞争&#xff0c;但基于搜索营销&#xff0c;它目前仍然显得十分重要。 那么&#xff0…

白话说编程之java线程

白话说编程之java线程线程和进程&#xff1a;进程&#xff1a;线程&#xff1a;线程和进程的区别&#xff1a;详解多线程:并发为什么使用并发并发的执行原理并行线程的五种状态&#xff1a;创建状态&#xff1a;就绪状态&#xff1a;运行状态&#xff1a;阻塞状态&#xff1a;死…