springboot常用扩展点
当涉及到Spring Boot的扩展和自定义时,Spring Boot提供了一些扩展点,使开发人员可以根据自己的需求轻松地扩展和定制Spring Boot的行为。本篇博客将介绍几个常用的Spring Boot扩展点,并提供相应的代码示例。
1. 自定义Starter(面试常问)
Spring Boot通过Starter来提供自动配置和依赖管理的功能。我们可以创建自己的Starter来打包和共享自定义组件。下面是一个简单的自定义Starter示例:
首先,创建一个Maven项目,并在pom.xml中添加以下依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.6.1</version>
</dependency>
然后,创建一个自动配置类,命名为CustomAutoConfiguration,并添加@Configuration和@EnableConfigurationProperties注解:
@Configuration
@EnableConfigurationProperties(CustomProperties.class)
public class CustomAutoConfiguration {// 自定义自动配置逻辑
}
接下来,创建一个自定义属性类CustomProperties,用于配置自定义属性:
@ConfigurationProperties("custom")
public class CustomProperties {private String message;// getter和setter方法省略
}
最后,在src/main/resources/META-INF/spring.factories文件中添加自动配置类的引用:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.CustomAutoConfiguration
现在,我们就可以将项目打包成一个jar文件,供其他项目使用,并通过配置文件进行自定义属性的配置。
2. 自定义条件注解
Spring Boot提供了多种条件注解,如@ConditionalOnProperty、@ConditionalOnClass等。这些注解在springboot框架中非常重要,包括springboot 的灵活性离不开条件注解。当然我们也可以自定义条件注解来根据特定条件决定是否生效。以下是一个示例:
首先,创建一个自定义条件注解@EnableCustomFeature:
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(CustomFeatureCondition.class)
public @interface EnableCustomFeature {String value();
}
然后,创建一个自定义条件类CustomFeatureCondition,实现Condition接口:
public class CustomFeatureCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {String propertyValue = context.getEnvironment().getProperty("custom.feature.enabled");return "true".equalsIgnoreCase(propertyValue);}
}
接下来,在使用自定义条件注解的类上添加注解@EnableCustomFeature:
@EnableCustomFeature("myFeature")
@SpringBootApplication
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}
最后,根据配置文件中的属性custom.feature.enabled的值决定是否启用自定义功能。
3. 自定义事件监听器
Spring Boot的事件模型允许我们监听和响应应用程序中发生的事件,这也是springboot的核心的一部分。我们可以创建自定义事件监听器,以便在特定事件发生时执行自定义逻辑。以下是一个示例:
首先,定义一个自定义事件类CustomEvent:
public class CustomEvent extends ApplicationEvent {public CustomEvent(Object source) {super(source);}
}
然后,创建一个自定义事件监听器CustomEventListener,实现ApplicationListener接口:
@Component
public class CustomEventListener implements ApplicationListener<CustomEvent> {@Overridepublic void onApplicationEvent(CustomEvent event) {// 执行自定义逻辑System.out.println("Custom event received: " + event.getSource());}
}
最后,在适当的地方触发自定义事件:
@Component
public class MyComponent {private final ApplicationEventPublisher eventPublisher;public MyComponent(ApplicationEventPublisher eventPublisher) {this.eventPublisher = eventPublisher;}public void doSomething() {// 触发自定义事件eventPublisher.publishEvent(new CustomEvent(this));}
}
以上示例中,CustomEventListener监听并处理CustomEvent事件,当事件触发时执行自定义逻辑。
4. 自定义启动器监听器
Spring Boot的启动器监听器(ApplicationRunner和CommandLineRunner)允许我们在应用程序启动后执行一些自定义逻辑。我们可以创建自己的启动器监听器来执行特定的初始化或后续操作。以下是一个示例:
@Component
public class CustomApplicationRunner implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) throws Exception {// 在应用程序启动后执行自定义逻辑System.out.println("Custom application runner executed");}
}
CustomApplicationRunner实现了ApplicationRunner接口,并在run方法中定义了自定义逻辑。当应用程序启动后,该逻辑将被执行。
5. CommandLineRunner和ApplicationRunner
CommandLineRunner和ApplicationRunner接口允许我们在Spring Boot应用程序启动后执行一些自定义逻辑。这些接口的实现类将在应用程序上下文加载完成后自动调用。它们可以用于执行一些初始化操作、数据加载、调度任务等。下面是一个示例:
@Component
public class MyCommandLineRunner implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {// 在应用程序启动后执行自定义逻辑System.out.println("Command line runner executed");}
}
在这个示例中,MyCommandLineRunner实现了CommandLineRunner接口,并在run方法中定义了自定义逻辑。当应用程序启动后,该逻辑将被执行。
6. WebMvcConfigurer
WebMvcConfigurer接口允许我们自定义和配置Spring MVC的行为。通过实现该接口,我们可以添加拦截器、自定义消息转换器、配置视图解析器等。以下是一个示例:
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 添加自定义拦截器registry.addInterceptor(new CustomInterceptor());}@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {// 添加自定义消息转换器converters.add(new CustomMessageConverter());}@Overridepublic void configureViewResolvers(ViewResolverRegistry registry) {// 配置自定义视图解析器registry.jsp("/WEB-INF/views/", ".jsp");}
}
在上述示例中,MyWebMvcConfigurer实现了WebMvcConfigurer接口,并重写了一些方法来添加拦截器、消息转换器和视图解析器。
7. ErrorController
ErrorController接口允许我们自定义处理应用程序中的错误和异常。通过实现该接口,我们可以自定义错误处理逻辑,例如在出现错误时返回自定义错误页面或响应。以下是一个示例:
@Controller
public class MyErrorController implements ErrorController {@RequestMapping("/error")public String handleError() {// 自定义错误处理逻辑return "error";}@Overridepublic String getErrorPath() {return "/error";}
}
在这个示例中,MyErrorController实现了ErrorController接口,并在handleError方法中定义了自定义错误处理逻辑。当应用程序出现错误时,将调用该方法进行处理。
以上是常用的Spring Boot扩展点的一部分。通过自定义Starter、自定义条件注解和事件发布机制d等扩展接口,我们可以灵活地扩展和定制Spring Boot应用程序的功能和行为,以满足特定的需求。
希望这篇博客对于刚接触Spring Boot的小伙伴有所帮助。如果您有任何进一步的问题,请随时提问(ps:后面还会对该篇文章更新,还有很多扩展的地方)。https://editor.csdn.net/md?not_checkout=1&spm=1001.2100.3001.4503&articleId=135513767
相关文章:
springboot常用扩展点
当涉及到Spring Boot的扩展和自定义时,Spring Boot提供了一些扩展点,使开发人员可以根据自己的需求轻松地扩展和定制Spring Boot的行为。本篇博客将介绍几个常用的Spring Boot扩展点,并提供相应的代码示例。 1. 自定义Starter(面试常问) Sp…...
19道ElasticSearch面试题(很全)
点击下载《19道ElasticSearch面试题(很全)》 1. elasticsearch的一些调优手段 1、设计阶段调优 (1)根据业务增量需求,采取基于日期模板创建索引,通过 roll over API 滚动索引; (…...
向爬虫而生---Redis 拓宽篇3 <GEO模块>
前言: 继上一章: 向爬虫而生---Redis 拓宽篇2 <Pub/Sub发布订阅>-CSDN博客 这一章的用处其实不是特别大,主要是针对一些地图和距离业务的;就是Redis的GEO模块。 GEO模块是Redis提供的一种高效的地理位置数据管理方案,它允许我们存储和查询…...
Vue项目里实现json对象转formData数据
平常调用后端接口传参都是json对象,当提交表单遇到有附件需要传递时,通常是把附件上传单独做个接口,也有遇到后端让提交接口一并把附件传递到后端,这种情况需要把参数转成formData的数据,需要用到new FormData()。json…...
leetcode刷题记录
栈 2696. 删除子串后的字符串最小长度 哈希表 1. 两数之和 用map来保存每个数和他的索引 383. 赎金信 用map来存储字符的个数 链表 2. 两数相加 指针的移动 动态规划 53. 最大子数组和 2707. 字符串中的额外字符 递归 101. 对称二叉树 数学 1276. 不浪费原料的汉堡…...
SpringMVC通用后台管理系统源码
整体的SSM后台管理框架功能已经初具雏形,前端界面风格采用了结构简单、 性能优良、页面美观大的Layui页面展示框架 数据库支持了SQLserver,只需修改配置文件即可实现数据库之间的转换。 系统工具中加入了定时任务管理和cron生成器,轻松实现系统调度问…...
深度解析Dubbo的基本应用与高级应用:负载均衡、服务超时、集群容错、服务降级、本地存根、本地伪装、参数回调等关键技术详解
负载均衡 官网地址: http://dubbo.apache.org/zh/docs/v2.7/user/examples/loadbalance/ 如果在消费端和服务端都配置了负载均衡策略, 以消费端为准。 这其中比较难理解的就是最少活跃调用数是如何进行统计的? 讲道理, 最少活跃数…...
备战2024美赛数学建模,文末获取历史优秀论文
总说(历年美赛优秀论文可获取) 数模的题型千变万化,我今天想讲的主要是一些「画图」、「建模」、「写作」和「论文结构」的思路,这些往往是美赛阅卷官最看重的点,突破了这些点,才能真正让你的美赛论文更上…...
Java加密解密大全(MD5、RSA)
目录 一、MD5加密二、RSA加解密(公加私解,私加公解)三、RSA私钥加密四、RSA私钥加密PKCS1Padding模式 一、MD5加密 密文形式:5eb63bbbe01eeed093cb22bb8f5acdc3 import java.math.BigInteger; import java.security.MessageDigest; import java.security…...
C语言程序设计考试掌握这些题妥妥拿绩点(写给即将C语言考试的小猿猴们)
目录 开篇说两句1. 水仙花数题目描述分析代码示例 2. 斐波那契数列题目描述分析代码示例 3. 猴子吃桃问题题目描述分析代码示例 4. 物体自由落地题目描述分析代码示例 5. 矩阵对角线元素之和题目描述分析代码示例 6. 求素数题目描述分析代码示例 7. 最大公约数和最小公倍数题目…...
编译ZLMediaKit(win10+msvc2019_x64)
前言 因工作需要,需要ZLMediaKit,为方便抓包分析,最好在windows系统上测试,但使用自己编译的第三方库一直出问题,无法编译通过。本文档记录下win10上的编译过程,供有需要的小伙伴使用 一、需要安装的软件…...
JS-基础语法(一)
JavaScript简单介绍 变量 常量 数据类型 类型转换 案例 1.JavaScript简单介绍 JavaScript 是什么? 是一种运行在客户端(浏览器)的编程语言,可以实现人机交互效果。 JS的作用 JavaScript的组成 JSECMAScript( 基础语法 )…...
18款Visual Studio实用插件(更新)
前言 俗话说的好工欲善其事必先利其器,安装一些Visual Studio实用插件对自己日常的开发和工作效率能够大大的提升,避免996从选一款好的IDE实用插件开始。以下是我认为比较实用的Visual Studio插件希望对大家有用,大家有更好的插件推荐可在文…...
三、java线性表(顺序表、链表、栈、队列)
java线性表 三、线性表1.1 顺序表1.2 链表1.2.1 单向链表(Singly Linked List)1.2.2 双向链表(Doubly Linked List) 1.3 LinkedList VS ArrayList1.3.7 使用 LinkedList 的场景 1.4 栈1.5 队列 三、线性表 线性表是一种经典的数据…...
PiflowX-MysqlCdc组件
MysqlCdc组件 组件说明 MySQL CDC连接器允许从MySQL数据库读取快照数据和增量数据。 计算引擎 flink 组件分组 cdc 端口 Inport:默认端口 outport:默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子hostnameHostname“”无是MySQL…...
2023春季李宏毅机器学习笔记 03 :机器如何生成文句
资料 课程主页:https://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.phpGithub:https://github.com/Fafa-DL/Lhy_Machine_LearningB站课程:https://space.bilibili.com/253734135/channel/collectiondetail?sid2014800 一、大语言模型的两种…...
dplayer播放hls格式视频并自动开始播放
监控视频流为hls格式,需要打开或刷新页面自动开始播放,需要安装dplayer和hls.js插件,插件直接npm装就行,上代码 import DPlayer from dplayer import Hls from hls.js //jquery是用来注册点击事件,实现自动开始播放 i…...
使用Vivado Design Suite平台板、将IP目录与平台板流一起使用
使用Vivado Design Suite平台板流 Vivado设计套件允许您使用AMD目标设计平台板(TDP)创建项目,或者已经添加到板库的用户指定板。当您选择特定板,Vivado设计工具显示有关板的信息,并启用其他设计器作为IP定制的一部分以…...
PACS医学影像报告管理系统源码带CT三维后处理技术
PACS从各种医学影像检查设备中获取、存储、处理影像数据,传输到体检信息系统中,生成图文并茂的体检报告,满足体检中心高水准、高效率影像处理的需要。 自主知识产权:拥有完整知识产权,能够同其他模块无缝对接 国际标准…...
介绍几种常见的质数筛选法
质数筛选法 1.暴力筛选法 :smirk:2.普通优化 :rofl:3.埃氏筛法:cold_sweat:4.线性筛选法:scream: 质数:除了1和他本身没有其它因数的正整数就是质数。1不是质数,2是质数。 1.暴力筛选法 😏 原理 求x的质数,令y从2到 x \sqrt[]{x…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
