论Spring或Spring Boot的花式扩展
文章目录
- 引言
- 扩展点讲述
- 花式扩展之自动配置类
- 花式扩展之实现接口
- 实现方式
- 样例
- 花式扩展之自定义starter
- Import方式
- SpringFactories方式
- 总结
- 鸣谢
引言
Spring Boot是一个高度可定制的框架,旨在帮助开发者快速创建、配置和管理他们的应用程序
扩展点讲述
Spring Boot的扩展点主要在于它允许开发者自定义和扩展其功能。例如,你可以通过创建自定义的自动配置类来覆盖或添加新的自动配置;或者通过实现Spring Boot的ApplicationContextAware或CommandLineRunner等接口来添加自定义的应用程序逻辑;此外,你还可以通过创建自定义的starter来封装和提供特定的依赖项集合。下面我将为大家介绍这三类自定义扩展的基本实现思路或案例
花式扩展之自动配置类
- 创建一个配置类,并在类上添加
@Configuration注解。 - 在该配置类中创建需要注册的 Bean,并使用
@Bean注解标注该方法。 - 如果需要配置属性,可以创建一个配置属性类,并在类上添加
@ConfigurationProperties注解。该注解的prefix属性指定了配置属性的前缀。 - 在配置类中使用
@EnableConfigurationProperties注解来启用该配置属性类。 - 如果需要条件化地注册 Bean,可以使用
@Conditional注解来指定一个条件。 - 如果需要指定一个 Bean 只在一个特定的 profile 处于激活状态时才会被注册,可以在 Bean 的定义方法上添加
@Profile注解,并指定需要激活的 profile。 - 如果需要自动装配 Bean 依赖,可以在属性或 setter 方法上添加
@Autowired注解。 - 如果需要注入具有指定名称的 Bean,可以在属性上添加
@Resource注解,并指定需要注入的 Bean 的名称。
花式扩展之实现接口
实现方式
- ApplicationContextInitializer:用于自定义应用程序上下文的初始化过程。
- SpringBootApplicationProcessor:用于自定义Spring Boot应用程序的配置。通过实现该接口并使用自定义逻辑,您可以修改Spring Boot应用程序的配置类。
- EnvironmentPostProcessor:用于自定义Spring环境的初始化和配置过程。通过实现该接口,您可以定义一个类,该类将在Spring环境创建之前或创建过程中被调用,允许您对环境变量的设置、配置文件的加载等进行自定义或修改。
- ResourceLoaderAware:提供对ResourceLoader的引用,让Bean可以访问到资源加载器
- ApplicationContextAware:提供ApplicationContext的引用,让Bean可以访问到应用程序上下文。
- ApplicationArguments:用于获取应用程序的命令行参数
- BeanNameGenerator:自定义Bean的名称生成策略。
- BeanDefinitionRegistryPostProcessor:允许在BeanDefinitionRegistry中注册所有的Bean之前执行一些自定义处理。
- BeanPostProcessor:允许在Bean的生命周期中进行一些自定义处理,比如自动装配和后处理。
- BeanFactoryPostProcessor:允许在BeanFactory初始化之前执行一些自定义处理,比如改变Bean的定义或替换其他Bean。
- EnvironmentAware:提供对SpringEnvironment的引用,让Bean可以访问到应用程序的环境信息。
- Initializer:用于在Bean的生命周期开始时执行一些自定义操作。
- ApplicationListener:监听ApplicationEvent的发布,用于响应应用程序级别的事件。
- MessageSourceAware:提供对MessageSource的引用,让Bean可以访问到国际化消息。
- BeanFactoryAware:提供对BeanFactory的引用,让Bean可以访问到Bean工厂。
- ApplicationContextAware:提供对ApplicationContext的引用,让Bean可以访问到应用程序上下文。
- ServletContextAware:提供对ServletContext的引用,让Bean可以访问到Web应用程序的上下文。
- BeanDestroyedHandler:在Bean的生命周期结束时执行一些自定义操作。
- Lifecycle:定义了Bean的生命周期接口,允许开发者在关键的生命周期方法(如初始化、销毁等)上执行一些自定义操作。
- CustomEditorConfigurer:允许定义自定义属性编辑器,用于将属性类型转换为适合的编辑器。
- ResourcePatternResolver:用于解析资源路径,以便找到指定的资源。
- BeanDefinitionReader:用于读取Bean定义信息,包括XML和Java配置类等。
- BeanDefinitionRegistry:用于管理Bean定义的注册和解析。
- BeanDefinitionDecoder:用于解码Bean定义信息,将其转换为可操作的Bean对象。
- BeanDefinitionDocumentReader:用于读取XML配置文件中的Bean定义信息。
- BeanDefinitionParser:用于解析特定类型的配置文件(如XML或Java类)。
- BeanDefinitionHolder:包含Bean定义和其相关的名称、别名等信息。
- BeanDefinitionVisitor:用于访问和操作Bean定义信息。
- BeanDefinitionReaderListener:监听Bean定义读取事件,用于在读取过程中执行一些自定义操作。
- BeanDefinitionRegistryListener:监听Bean定义注册事件,用于在注册过程中执行一些自定义操作。
- BeanDefinitionParserDelegate:提供了一些辅助方法来帮助解析和校验Bean定义信息。
- BeanDefinitionValidationVisitor:用于校验Bean定义的合法性。
- BeanNameGeneratorHolder:包含一个BeanNameGenerator和一个BeanNameGeneratorDelegate。
- BeanFactoryInitializerAdapter:允许通过BeanFactory实现BeanFactoryInitializr接口的功能。
- LifeCycleProcessor:用于在Bean的生命周期中执行自定义操作,比如在Bean的生命周期事件发生时执行特定的逻辑。
- CommandLineRunner:用于在应用程序启动后执行自定义的命令行逻辑。通过实现该接口,您可以定义一个类,在该类的run方法中编写自定义逻辑,以便在应用程序启动后执行特定的操作。
- ApplicationRunner:与CommandLineRunner类似,用于在应用程序启动后执行自定义逻辑。与CommandLineRunner不同的是,ApplicationRunner更适用于复杂的命令行参数处理和输出结果的处理。
- WebMvcConfigurer:用于自定义Spring MVC的配置。通过实现该接口并重写addConventions方法,您可以自定义Spring MVC的约定,比如自定义控制器路径、异常处理等。
- AsyncConfigurer:用于自定义异步方法的配置。通过实现该接口并重写getAsyncExecutor方法,您可以自定义异步执行的线程池配置,比如线程池大小、线程池类型等。
样例
@SpringBootApplication
@Slf4j
public class J4nJspApplication implements ApplicationContextAware , BeanNameGenerator , BeanDefinitionRegistryPostProcessor, BeanPostProcessor, BeanFactoryPostProcessor
, EnvironmentAware, CommandLineRunner {public static void main(String[] args) {SpringApplication.run(J4nJspApplication.class, args);}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {log.info("获取上下文进行操作");}@Overridepublic String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {log.info("我可以改变bean的名称");return null;}@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {log.info("我可以获取容器并修改bean或添加bean");}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {log.info("提供了bean definition的解析和注册功能,可以解析配置文件中定义的Bean只是我的功能之一而已");}@Overridepublic void setEnvironment(Environment environment) {log.info("环境变量{}", JSONUtil.toJsonStr(environment));}@Overridepublic void run(String... args) throws Exception {log.info("我可以在项目启动后执行一些操作");}
}
花式扩展之自定义starter
Import方式
- @Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationxxxx.class)
public@interface EnableAutoConfiguration{} AutoConfigurationxxxximplementsBeanFactoryAware, EnvironmentAware, Ordered ...- 启动类标记
@EnableAutoConfiguration
SpringFactories方式
- 新建文件
resources/META-INFO/spring.factories - 文件配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=你的配置类包路径.配置类,xxx,xxx,xxx,多个配置类逗号分隔
总结
- 自动配置:Spring 的自动配置功能可以帮助开发者快速搭建应用程序框架,但是有时候默认的配置可能不能满足实际需求。通过自定义扩展,开发者可以提供自己的自动配置代码,覆盖默认配置,以满足特定的应用需求。
- 实现接口:Spring 提供了许多接口和抽象类,开发者可以通过实现这些接口来自定义扩展功能。通过实现接口,开发者可以定制自己的业务逻辑,增强 Spring 功能,提高应用程序的灵活性和可维护性。
- starters:Spring Boot 的 starters是 Spring 提供的一种快速启动项目的方式,它提供了一些常用的依赖库,使得开发者在启动项目时不需要手动添加这些依赖。通过自定义扩展,开发者可以添加自己的 starters,提供更多的功能和库支持,使得其他开发者能够更方便地使用自己的项目。
鸣谢
- 非常感谢你从头到尾阅读了这篇文章,希望其中的内容对你有所启发和帮助。如果你还有其他问题或需要进一步的了解,欢迎随时关注我的动态并留言
- 最后可以给作者点个关注和小赞赞嘛,谢谢!
- 觉得有收藏价值可以进行收藏
相关文章:
论Spring或Spring Boot的花式扩展
文章目录 引言扩展点讲述花式扩展之自动配置类花式扩展之实现接口实现方式样例 花式扩展之自定义starterImport方式SpringFactories方式 总结鸣谢 引言 Spring Boot是一个高度可定制的框架,旨在帮助开发者快速创建、配置和管理他们的应用程序 扩展点讲述 Spring Bo…...
如何评估分类模型的好坏
如何评估分类模型的好坏 评估分类预测模型的质量,常用一个矩阵、三条曲线和六个指标。 一个矩阵:混淆矩阵;三条曲线:ROC曲线、PR曲线、KS曲线;六个指标:正确率Acc、查全率R、查准率P、F值、AUC、BEP值、KS…...
● 84.柱状图中最大的矩形
84.柱状图中最大的矩形 class Solution { public:int largestRectangleArea(vector<int>& heights) {stack<int>st;heights.insert(heights.begin(),0);heights.push_back(0);st.push(0);int res0;for(int i1;i<heights.size();i){while(heights[i]<heig…...
未检查的转换: ‘java.lang.Object‘ 转换为 ‘java.util.List
fastjson方式 Object object ... // 获取待转换的objectList<WbsCategory> list JSON.parseObject(JSON.toJSONString(object), new TypeReference<List<WbsCategory>>() {}); 在这个示例中,我们使用JSON.toJSONString()将object对象转换…...
【C语言】使用C语言,实现九九乘法表(另附Python、Java、JavaScript实现方式)
文章目录 1. C语言实现1.1 思路1.2 代码实现 3.其他语言实现3.1 Python实现3.2 Java实现3.3 JavaScript实现 1. C语言实现 1.1 思路 九九乘法表图示: 思路如下:定义两层for循环即可实现九九乘法表 一共有9层,所以要定义一个变量iÿ…...
[机缘参悟-102] :IT人 - 管理的本质?管理人与从事技术的本质区别?人性、冰山模型、需求层次模型
感悟: 管理的本质是:学习各种管理理论、方法、技能,克服自身的人性缺点、预防他人人性的恶点、利用他人的人性特点拿到结果,从而完成组织、管理者的上司、管理者自身、管理者下属的目标。管理中的问题,80%以上都人性问…...
[论文阅读笔记26]Tracking Everything Everywhere All at Once
论文地址: 论文 代码地址: 代码 这是一篇效果极好的像素级跟踪的文章, 发表在ICCV2023, 可以非常好的应对遮挡等情形, 其根本的方法在于将2D点投影到一个伪3D(quasi-3D)空间, 然后再映射回去, 就可以在其他帧中得到稳定跟踪. 这篇文章的方法不是很好理解, 代码也刚开源, 做一…...
【Java 动态数据统计图】前后端对接数据格式(Map返回数组格式数据)六(120)
说明: 前端使用:vue3.0 前后端对接数据格式:无非就是前端把后端返回的数据处理为自己想要的格式,或者,后端给前端处理好想要的格式; 针对前后端的柱状图,趋势图等数据对接,前端一般需…...
❤ 给自己的mac系统上安装java环境
❤ 给自己的mac系统上安装java环境 🍓 作为前端工程师如何给自己的mac系统上安装java环境 🍎 最近因为自己的一些项目需求,mac电脑上需要安装一些后台的java环境,用来跑后台的java程序,于是从一个前端工程师的角度安…...
Java-匿名类
介绍 匿名类是指没有名字的类,它对一个给定的类进行拓展,或者实现一个给定的接口。使用匿名类可以使得代码更加简洁、紧凑、模块程度更高。 实现方式及语法 匿名类有两种实现方式 继承一个类,重写其方法实现一个接口(可以是多…...
Maven的超级POM
对于我们创建的一个maven工程,即便我们自己的pom.xm文件中没有明确指定一个父工程(父POM),其实也默认继承了超级POM,就好比JAVA类继承Object类一样。 maven官网关于超级POM的介绍: https://maven.apache.o…...
软考高级系统架构设计师系列论文九十二:论新技术的引进
软考高级系统架构设计师系列论文九十二:论新技术的引进 一、摘要二、正文三、总结一、摘要 根据国家税务总局对税务系统内所有系统进行集成与整合的需求,我所在的开发单位组织了全国金税工程防伪税控系统网络版的升级开发工作。该项目工程浩大,要求在具有严格的安全、可靠性…...
vue使用Bootstrap的详细方法
要在Vue中使用Bootstrap,您可以按照以下步骤进行操作: 安装Bootstrap:首先,您需要安装Bootstrap。您可以使用npm或者yarn来安装Bootstrap。打开终端,并在项目的根目录中运行以下命令: npm install bootst…...
leetcode做题笔记103. 二叉树的锯齿形层序遍历
给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。 思路一:BFS #define N 2000int** zigzagLevelOrder(st…...
如果将PC电脑变成web服务器:利用Nignx反向代理绕过运营商对80端口封锁
如果将PC电脑变成web服务器:利用Nignx反向代理绕过运营商对80端口封锁 在上一篇文章中,我们已经实现了内网主机的多次端口映射,将内网主机的端口映射到了公网,可以通过公网访问该主机了。 因为电信的家庭宽带,默认是…...
Eureka:服务注册-信息配置-自我保护机制
首先在提供者服务下,添加一个依赖 <!-- Eureka --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId><version>1.4.6.RELEASE</version><…...
C++二叉树进阶
本期内容我们讲解二叉树的进阶知识,没有看过之前内容的小伙伴建议先看往期内容 二叉树-----补充_KLZUQ的博客-CSDN博客 目录 二叉搜索树 代码实现 基础框架 Insert Find Erase 析构函数 拷贝构造 赋值 二叉搜索树的应用 全部代码 二叉搜索树 二叉搜索树…...
layui tree组件取消勾选
layui(2.8.15) tree的api中,只有 tree.setChecked(id, idArr) 方法,没有取消勾选的方法。 我的需求是:勾选后做判断,如果不符合条件则取消勾选。 实现方法: 使用 tree的oncheck事件,在回调函数中做判断&…...
【Android基础面试题】ViewPager与ViewPager2的区别
ViewPager和ViewPager2是Android中用于实现滑动页面切换的控件。它们的主要区别如下: 实现方式 ViewPager2的内部实现是RecyclerView,而ViewPager是通过继承自ViewGroup实现的。因此,ViewPager2的性能更高。 滑动方向 ViewPager2可以实现横向…...
springCloudGateway网关配置
1.配置跨域支持 /*** 跨域支持*/ Configuration public class CorsConfig {Beanpublic CorsWebFilter corsFilter() {CorsConfiguration config new CorsConfiguration();config.addAllowedMethod("*");config.addAllowedOrigin("*");config.addAllowedH…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...
自定义线程池1.2
自定义线程池 1.2 1. 简介 上次我们实现了 1.1 版本,将线程池中的线程数量交给使用者决定,并且将线程的创建延迟到任务提交的时候,在本文中我们将对这个版本进行如下的优化: 在新建线程时交给线程一个任务。让线程在某种情况下…...
在ubuntu等linux系统上申请https证书
使用 Certbot 自动申请 安装 Certbot Certbot 是 Let’s Encrypt 官方推荐的自动化工具,支持多种操作系统和服务器环境。 在 Ubuntu/Debian 上: sudo apt update sudo apt install certbot申请证书 纯手动方式(不自动配置)&…...
