当前位置: 首页 > news >正文

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

CommandLineRunnerApplicationRunner接口允许我们在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的扩展和自定义时&#xff0c;Spring Boot提供了一些扩展点&#xff0c;使开发人员可以根据自己的需求轻松地扩展和定制Spring Boot的行为。本篇博客将介绍几个常用的Spring Boot扩展点&#xff0c;并提供相应的代码示例。 1. 自定义Starter(面试常问) Sp…...

19道ElasticSearch面试题(很全)

点击下载《19道ElasticSearch面试题&#xff08;很全&#xff09;》 1. elasticsearch的一些调优手段 1、设计阶段调优 &#xff08;1&#xff09;根据业务增量需求&#xff0c;采取基于日期模板创建索引&#xff0c;通过 roll over API 滚动索引&#xff1b; &#xff08;…...

向爬虫而生---Redis 拓宽篇3 <GEO模块>

前言: 继上一章: 向爬虫而生---Redis 拓宽篇2 &#xff1c;Pub/Sub发布订阅&#xff1e;-CSDN博客 这一章的用处其实不是特别大,主要是针对一些地图和距离业务的;就是Redis的GEO模块。 GEO模块是Redis提供的一种高效的地理位置数据管理方案&#xff0c;它允许我们存储和查询…...

Vue项目里实现json对象转formData数据

平常调用后端接口传参都是json对象&#xff0c;当提交表单遇到有附件需要传递时&#xff0c;通常是把附件上传单独做个接口&#xff0c;也有遇到后端让提交接口一并把附件传递到后端&#xff0c;这种情况需要把参数转成formData的数据&#xff0c;需要用到new FormData()。json…...

leetcode刷题记录

栈 2696. 删除子串后的字符串最小长度 哈希表 1. 两数之和 用map来保存每个数和他的索引 383. 赎金信 用map来存储字符的个数 链表 2. 两数相加 指针的移动 动态规划 53. 最大子数组和 2707. 字符串中的额外字符 递归 101. 对称二叉树 数学 1276. 不浪费原料的汉堡…...

SpringMVC通用后台管理系统源码

整体的SSM后台管理框架功能已经初具雏形&#xff0c;前端界面风格采用了结构简单、 性能优良、页面美观大的Layui页面展示框架 数据库支持了SQLserver,只需修改配置文件即可实现数据库之间的转换。 系统工具中加入了定时任务管理和cron生成器&#xff0c;轻松实现系统调度问…...

深度解析Dubbo的基本应用与高级应用:负载均衡、服务超时、集群容错、服务降级、本地存根、本地伪装、参数回调等关键技术详解

负载均衡 官网地址&#xff1a; http://dubbo.apache.org/zh/docs/v2.7/user/examples/loadbalance/ 如果在消费端和服务端都配置了负载均衡策略&#xff0c; 以消费端为准。 这其中比较难理解的就是最少活跃调用数是如何进行统计的&#xff1f; 讲道理&#xff0c; 最少活跃数…...

备战2024美赛数学建模,文末获取历史优秀论文

总说&#xff08;历年美赛优秀论文可获取&#xff09; 数模的题型千变万化&#xff0c;我今天想讲的主要是一些「画图」、「建模」、「写作」和「论文结构」的思路&#xff0c;这些往往是美赛阅卷官最看重的点&#xff0c;突破了这些点&#xff0c;才能真正让你的美赛论文更上…...

Java加密解密大全(MD5、RSA)

目录 一、MD5加密二、RSA加解密(公加私解&#xff0c;私加公解)三、RSA私钥加密四、RSA私钥加密PKCS1Padding模式 一、MD5加密 密文形式&#xff1a;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)

前言 因工作需要&#xff0c;需要ZLMediaKit&#xff0c;为方便抓包分析&#xff0c;最好在windows系统上测试&#xff0c;但使用自己编译的第三方库一直出问题&#xff0c;无法编译通过。本文档记录下win10上的编译过程&#xff0c;供有需要的小伙伴使用 一、需要安装的软件…...

JS-基础语法(一)

JavaScript简单介绍 变量 常量 数据类型 类型转换 案例 1.JavaScript简单介绍 JavaScript 是什么&#xff1f; 是一种运行在客户端&#xff08;浏览器&#xff09;的编程语言&#xff0c;可以实现人机交互效果。 JS的作用 JavaScript的组成 JSECMAScript( 基础语法 )…...

18款Visual Studio实用插件(更新)

前言 俗话说的好工欲善其事必先利其器&#xff0c;安装一些Visual Studio实用插件对自己日常的开发和工作效率能够大大的提升&#xff0c;避免996从选一款好的IDE实用插件开始。以下是我认为比较实用的Visual Studio插件希望对大家有用&#xff0c;大家有更好的插件推荐可在文…...

三、java线性表(顺序表、链表、栈、队列)

java线性表 三、线性表1.1 顺序表1.2 链表1.2.1 单向链表&#xff08;Singly Linked List&#xff09;1.2.2 双向链表&#xff08;Doubly Linked List&#xff09; 1.3 LinkedList VS ArrayList1.3.7 使用 LinkedList 的场景 1.4 栈1.5 队列 三、线性表 线性表是一种经典的数据…...

PiflowX-MysqlCdc组件

MysqlCdc组件 组件说明 MySQL CDC连接器允许从MySQL数据库读取快照数据和增量数据。 计算引擎 flink 组件分组 cdc 端口 Inport&#xff1a;默认端口 outport&#xff1a;默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子hostnameHostname“”无是MySQL…...

2023春季李宏毅机器学习笔记 03 :机器如何生成文句

资料 课程主页&#xff1a;https://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.phpGithub&#xff1a;https://github.com/Fafa-DL/Lhy_Machine_LearningB站课程&#xff1a;https://space.bilibili.com/253734135/channel/collectiondetail?sid2014800 一、大语言模型的两种…...

dplayer播放hls格式视频并自动开始播放

监控视频流为hls格式&#xff0c;需要打开或刷新页面自动开始播放&#xff0c;需要安装dplayer和hls.js插件&#xff0c;插件直接npm装就行&#xff0c;上代码 import DPlayer from dplayer import Hls from hls.js //jquery是用来注册点击事件&#xff0c;实现自动开始播放 i…...

使用Vivado Design Suite平台板、将IP目录与平台板流一起使用

使用Vivado Design Suite平台板流 Vivado设计套件允许您使用AMD目标设计平台板&#xff08;TDP&#xff09;创建项目&#xff0c;或者已经添加到板库的用户指定板。当您选择特定板&#xff0c;Vivado设计工具显示有关板的信息&#xff0c;并启用其他设计器作为IP定制的一部分以…...

PACS医学影像报告管理系统源码带CT三维后处理技术

PACS从各种医学影像检查设备中获取、存储、处理影像数据&#xff0c;传输到体检信息系统中&#xff0c;生成图文并茂的体检报告&#xff0c;满足体检中心高水准、高效率影像处理的需要。 自主知识产权&#xff1a;拥有完整知识产权&#xff0c;能够同其他模块无缝对接 国际标准…...

介绍几种常见的质数筛选法

质数筛选法 1.暴力筛选法 :smirk:2.普通优化 :rofl:3.埃氏筛法:cold_sweat:4.线性筛选法:scream: 质数&#xff1a;除了1和他本身没有其它因数的正整数就是质数。1不是质数&#xff0c;2是质数。 1.暴力筛选法 &#x1f60f; 原理 求x的质数&#xff0c;令y从2到 x \sqrt[]{x…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]

报错信息&#xff1a;libc.so.6: cannot open shared object file: No such file or directory&#xff1a; #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版

1.题目描述 2.思路 当前的元素可以重复使用。 &#xff08;1&#xff09;确定回溯算法函数的参数和返回值&#xff08;一般是void类型&#xff09; &#xff08;2&#xff09;因为是用递归实现的&#xff0c;所以我们要确定终止条件 &#xff08;3&#xff09;单层搜索逻辑 二…...

大模型真的像人一样“思考”和“理解”吗?​

Yann LeCun 新研究的核心探讨&#xff1a;大语言模型&#xff08;LLM&#xff09;的“理解”和“思考”方式与人类认知的根本差异。 核心问题&#xff1a;大模型真的像人一样“思考”和“理解”吗&#xff1f; 人类的思考方式&#xff1a; 你的大脑是个超级整理师。面对海量信…...

Web APIS Day01

1.声明变量const优先 那为什么一开始前面就不能用const呢&#xff0c;接下来看几个例子&#xff1a; 下面这张为什么可以用const呢&#xff1f;因为复杂数据的引用地址没变&#xff0c;数组还是数组&#xff0c;只是添加了个元素&#xff0c;本质没变&#xff0c;所以可以用con…...

从0开始一篇文章学习Nginx

Nginx服务 HTTP介绍 ## HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。 ## HTTP工作在 TCP/IP协议体系中的TCP协议上&#…...

Xcode 16.2 版本 pod init 报错

Xcode 版本升级到 16.2 后&#xff0c;项目执行 pod init 报错&#xff1b; ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchron…...

链结构与工作量证明7️⃣:用 Go 实现比特币的核心机制

链结构与工作量证明:用 Go 实现比特币的核心机制 如果你用 Go 写过区块、算过哈希,也大致理解了非对称加密、数据序列化这些“硬核知识”,那么恭喜你,现在我们终于可以把这些拼成一条完整的“区块链”。 不过别急,这一节我们重点搞懂两件事: 区块之间是怎么连接成“链”…...