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

自定义一个SpringBoot场景启动器

前言

一个刚刚看完SpringBoot自动装配原理的萌新依据自己的理解写下的文章,如有大神发现错误,敬请斧正,不胜感激。

分析SpringBoot自动配置原理

  1. SpringBoot的启动从被@SpringBootApplication修饰的启动类开始,@SpringBootApplicaiotn注解中最重要的注解是@EnableAutoConfiguration,其负责自动装配,底层由@Import()注解中传入一个ImportSeletor的实现类AutoConfigurationImportSelector完成自动配置类的导入
  2. AutoConfigurationImportSelector类中selectImports方法负责返回一个由自动配置类权限定类名组成的字符串数组,在这个方法中扫描了spring-boot-autoconfigure-2.6.13.jar/WEB-INF/spring.factories中的所有权限定类名,经层层返回以及@Conditional系类的注解筛选后,将需要加载的配置交给IOC容器完成自动配置

一个标准的SpringBoot启动器的组成

一个“干活的”类

这个类是整个模块的核心,他完成整个模块中的逻辑操作,他的参数需要从配置文件中获取,他需要被纳入IOC容器的管理

一个"搬运工"类

这个类从配置文件中读取数据,并被注入到核心类中,是核心类从配置文件中获取数据的桥梁

一个"与SpringBoot沟通"的类

这个类的权限定类名被写入到spring-boot-autoconfigure-2.6.13.jar/WEB-INF/spring.factories文件中,在SpringBoot容器启动时被读取,并通过@Conditional系列注解判断是否加载该配置文件,以及将核心类纳入到IOC容器管理

自定义SpringBoot启动器

目标:完成一个自我介绍类,从配置文件中获取name以及introduction介绍词

搬运工类SelfIntroductionPropertis

@ConfigurationProperties(prefix = "self") // 指定配置文件中的前缀
@Data
public class SelfIntroductionPropertis {private String name = "Default Name";private String introduction = "Default Introduction";
}

@ConfigutationProperties(prefix=“self”)使用配置绑定对象完成对配置的读取

核心类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class SelfIntroductionService {@Resourceprivate SelfIntroductionPropertis selfIntroductionProperties;public String say(){return "Hello,My name is" + selfIntroductionProperties.getName() + "," + selfIntroductionProperties.getIntroduction();}
}
  • @Resource 自动注入SelfIntroductionPropertis对象
  • say()方法完成该模块的主要功能

与"SpringBoot"沟通,完成自动装配的类

@EnableConfigurationProperties(SelfIntroductionPropertis.class) 
//开启对SelfIntroductionPropertis类中@ConfigurationProperties注解的配置绑定支持,并将其纳入IOC容器管理
@ConditionalOnClass(SelfIntroductionService.class)
@Configuration // 是一个配置类,配置bean
public class SelfIntroductionAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic SelfIntroductionService selfIntroductionService() {return new SelfIntroductionService();}
}
  • @EnableConfigurationProperties注解开启对SelfIntroductionPropertis类中@ConfigurationProperties注解的配置绑定支持,并将其纳入IOC容器管理
  • @ConditionalOnClass(SelfIntroductionService.class)完成自动配置的关键,只有当核心类存在时才引入这个配置类
  • @Bean 将SelfIntroductionService纳入IOC容器的管理,并指定name

将自动配置类加入到SpringBoot自动配置jar包中的WEB-INF/spring.factories中

从包中复制.factories文件到main/resource/WEB-INF文件夹下,使该自动配置类在SpringBoot启动时能被扫描到,完成自动配置
在这里插入图片描述

打包,并存入本地maven仓库

测试

新建SpringBoot工程并将自定义启动器引入

<?xml version="1.0" encoding="UTF-8"?>
<project>
。。。<dependencies><dependency><groupId>xyz.wrywebsite</groupId><artifactId>springboot-mystarted</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
。。。</project>

配置文件编写

server.port=8080
self.name=lisi
self.introduction=wow wow wow

编写测试类

@RestController
public class BasicController {@Resourceprivate SelfIntroductionService selfIntroductionService;@GetMapping("/selfIntroduction")public String selfIntroduction() {return selfIntroductionService.say();}}

运行,输出结果

Hello,My name islisi,wow wow wow

相关文章:

自定义一个SpringBoot场景启动器

前言 一个刚刚看完SpringBoot自动装配原理的萌新依据自己的理解写下的文章&#xff0c;如有大神发现错误&#xff0c;敬请斧正&#xff0c;不胜感激。 分析SpringBoot自动配置原理 SpringBoot的启动从被SpringBootApplication修饰的启动类开始,SpringBootApplicaiotn注解中最…...

UDP的报文结构和注意事项

UDP协议是在传输层的协议。 UDP无连接&#xff0c;不可靠传输&#xff0c;面向数据报&#xff0c;全双工。 UDP的报文结构 学习网络协议&#xff0c;最主要的就是报文格式。 对于UDP来说&#xff0c;应用层的数据到达&#xff0c;UDP之后&#xff0c;就会给应用层的数据报前面…...

rust语言一些规则学习

目录 rust中迭代器的使用&#xff08;iter().map()与for循环的区别&#xff09;map()与for的描述区别总结 最后更新时间2024-05-24 rust中迭代器的使用&#xff08;iter().map()与for循环的区别&#xff09; map()与for的描述 rust源码中关于iter().map()函数的解释&#xff…...

QML基本语法介绍

为什么使用QML 开发者效率 将前后端分离,QML和JavaScript语言主要用于前度UI的方法,后端有C++来完成绘制。将JavaScript和C++分开能够快速迭代开发; 跨平台移植性 基于Qt平台的统一抽象概念,现在可以更加容易和快速和将Qt移植到更多的平台上。 开发的开放 Qt是由Qt-Proje…...

学习和分享关于 Vue.js 的路由(vue-router)

学习和分享关于 Vue.js 的路由&#xff08;vue-router&#xff09;是一个非常有价值的主题&#xff0c;因为路由是构建单页应用程序&#xff08;SPA&#xff09;的核心部分。本文将介绍 Vue.js 路由的基本概念和实现&#xff0c;并展示一个典型的项目目录结构。 目录 Vue.js 路…...

小猪APP分发:一站式免费应用推广解决方案

在竞争激烈的移动应用市场中&#xff0c;寻找一个高效且成本友好的方式来推广自己的应用程序&#xff0c;成为了众多开发者面临的共同挑战。幸运的是&#xff0c;像"小猪APP分发www.appzhu.cn"这样的平台应运而生&#xff0c;为开发者提供了一个全面、免费的应用分发…...

新抖:抖音的数据分析平台,敢用深色系,别的真不敢!

举报 评论 0...

独享IP是原生IP吗?二者有何区别?

原生IP&#xff1a; 原生IP是指由Internet服务提供商&#xff08;ISP&#xff09;直接分配给用户的IP地址&#xff0c;这些IP地址通常反映了用户的实际地理位置和网络连接。原生IP是用户在其所在地区或国家使用的真实IP地址&#xff0c;与用户的物理位置直接相关。在跨境电商中…...

AI大模型探索之路-实战篇7:Function Calling技术实战:自动生成函数

系列篇章&#x1f4a5; AI大模型探索之路-实战篇4&#xff1a;深入DB-GPT数据应用开发框架调研 AI大模型探索之路-实战篇5&#xff1a;探索Open Interpreter开放代码解释器调研 AI大模型探索之路-实战篇6&#xff1a;掌握Function Calling的详细流程 目录 系列篇章&#x1f4a…...

Android14 - 绘制系统 - 概览

从Android 12开始&#xff0c;Android的绘制系统有结构性变化&#xff0c; 在绘制的生产消费者模式中&#xff0c;新增BLASTBufferQueue&#xff0c;客户端进程自行进行queue的生产和消费&#xff0c;随后通过Transation提交到SurfaceFlinger&#xff0c;如此可以使得各进程将缓…...

Add object from object library 从对象库中添加内置器件

Add object from object library 从对象库中添加内置器件 正文正文 对于 Lumerical,有些时候我们在使用中,可能需要从 Object library 中添加器件,通常我们的做法是手动添加。如下图所示,我们添加一个 Directional Coupler 到我们的工程文件中: 但是这种操作方式不够智能…...

天诚公租房/人才公寓WiFi人脸识别物联网智能门锁解决方案

人才是引领城市高质量发展的重要因素&#xff0c;城市要想吸纳人才的保障便是人才公寓。近年来&#xff0c;全国各地一二三线城市都在大力建设人才公寓&#xff0c;集聚菁英人才&#xff0c;倾力打造人才高地。 一、人才公寓如火如荼建设 2023年底&#xff0c;山东德州提出三年…...

JAVA学习-练习试用Java实现“子集”

问题&#xff1a; 给定一个整数数组 nums&#xff0c;数组中的元素互不相同。返回该数组所有可能的子集&#xff08;幂集&#xff09;。解集不能包含重复的子集。可以按任意顺序返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[],[1],[2],[…...

揭秘《庆余年算法番外篇》:范闲如何使用维吉尼亚密码解密二皇子密信

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…...

Java进阶学习笔记11——多态

什么是多态&#xff1f; 多态是在继承/实现情况下一种现象&#xff0c;表现为&#xff1a;对象多态和行为多态。 同一个对象&#xff0c;在不同时刻表现出来的不同形态。 多态的前提&#xff1a; 要有继承/实现关系 要有方法的重写 要有父类引用指向子类对象。 多态的具体代码…...

注意力机制篇 | YOLOv8改进之引入用于目标检测的混合局部通道注意力MLCA

前言:Hello大家好,我是小哥谈。注意力机制是可以帮助神经网络突出重要元素,抑制无关元素。然而,绝大多数通道注意力机制只包含通道特征信息,忽略了空间特征信息,导致模型表示效果或目标检测性能较差,且空间注意模块往往较为复杂。为了在性能和复杂性之间取得平衡,本文提…...

百度生成数据库

问题1&#xff1a; 帮我创建2个表student与score表&#xff0c;要求student表有id,createDate,userName,phone,age,sex,introduce&#xff0c; 要求score表有id,scoreName,result,studentId(student表的id外键)。 要求student表中插入5条学生信息&#xff0c;都要是中文的。 要…...

【SpringBoot】整合百度文字识别

流程图 一、前期准备 1.1 打开百度智能云官网找到管理中心创建应用 全选文字识别 1.2 保存好AppId、API Key和Secret Key 1.3 找到通用场景文字识别&#xff0c;立即使用 1.4 根据自己需要&#xff0c;选择要开通的项目 二、代码编写 以通用文字识别&#xff08;高精度版&am…...

Java如何设计一个功能

流程说明:实现一组功能的步骤 1,充分了解需求,包括所有的细节,需要知道要做一个什么样的功能。 2,设计实体/表 正向工程:设计实体、映射文件 --> 建表 反向工程:设计表 --> 映射文件、实体 设计实体类型分析步骤&#xff1a; 1&#xff09;功能模块有几个实体…...

MySQL 字符字段长度设置详解:语法、注意事项和示例

本文将详细介绍在 MySQL 数据库中如何设置字符字段的长度。将介绍字符字段的数据类型、长度限制、语法示例&#xff0c;并提供具体的示例&#xff0c;以正确设置和管理字符字段的长度。 1. MySQL 字符字段长度概述 在 MySQL 中&#xff0c;字符字段是用于存储文本型数据的列。…...

ZYNQ PS+PL协同设计:从bit文件生成到QSPI Flash固化的全流程实战

1. ZYNQ PSPL协同设计基础概念 第一次接触ZYNQ芯片的开发者经常会困惑&#xff1a;为什么这个"FPGA"还需要配置ARM处理器&#xff1f;其实ZYNQ的本质是一个异构计算平台&#xff0c;它把传统FPGA&#xff08;PL部分&#xff09;和ARM处理器&#xff08;PS部分&#x…...

.NET 诊断技巧 | 日志框架原理、手写日志框架学习秸

一、 什么是 AI Skills&#xff1a;从工具级到框架级的演化 AI Skills&#xff08;AI 技能&#xff09; 的概念最早在 Claude Code 等前沿 Agent 实践中被强化。最初&#xff0c;Skills 被视为“工具级”的增强&#xff0c;如简单的文件读写或终端操作&#xff0c;方便用户快速…...

logrotate配置中的copytruncate如何使用?

copytruncate 是 logrotate 配置文件中的一个指令&#xff0c;用于在轮转日志时采用 “先复制&#xff0c;再清空” 的策略&#xff0c;而不是默认的 “先重命名&#xff0c;再新建” 策略。 工作原理 默认情况下&#xff08;没有 copytruncate&#xff09;&#xff0c;logrota…...

Lumafly:让空洞骑士模组管理变得像呼吸一样简单

Lumafly&#xff1a;让空洞骑士模组管理变得像呼吸一样简单 【免费下载链接】Lumafly A cross platform mod manager for Hollow Knight written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/lu/Lumafly 还在为空洞骑士模组安装的繁琐流程而烦恼吗&#xf…...

Teeworlds游戏优化技巧:10个提升游戏性能的关键设置

Teeworlds游戏优化技巧&#xff1a;10个提升游戏性能的关键设置 【免费下载链接】teeworlds A retro multiplayer shooter 项目地址: https://gitcode.com/gh_mirrors/te/teeworlds Teeworlds是一款复古风格的多人射击游戏&#xff0c;拥有独特的像素艺术风格和快节奏的…...

告别命令行!用rosbridge_suite和WebSocket在浏览器里遥控你的ROS机器人(附完整代码)

浏览器操控ROS机器人&#xff1a;rosbridge_suite与WebSocket实战指南 想象一下&#xff0c;你正在开发一个机器人项目&#xff0c;需要频繁测试不同运动指令对机器人行为的影响。每次修改参数都要重新编译、运行命令行&#xff0c;不仅效率低下&#xff0c;还容易打断思路。有…...

终极指南:如何快速免费恢复加密压缩包密码

终极指南&#xff1a;如何快速免费恢复加密压缩包密码 【免费下载链接】ArchivePasswordTestTool 利用7zip测试压缩包的功能 对加密压缩包进行自动化测试密码 项目地址: https://gitcode.com/gh_mirrors/ar/ArchivePasswordTestTool 您是否曾经遇到过这种情况&#xff1…...

从幻觉到失控,大模型对齐为何总在上线后崩盘?5个被99%团队忽略的工程断点

第一章&#xff1a;从幻觉到失控&#xff1a;大模型对齐崩盘的本质归因 2026奇点智能技术大会(https://ml-summit.org) 大模型的“对齐崩盘”并非偶然故障&#xff0c;而是多重目标函数在高维策略空间中发生结构性解耦的必然结果。当监督微调&#xff08;SFT&#xff09;与基于…...

DAMO-YOLO TinyNAS模型蒸馏教程:小模型训练指南

DAMO-YOLO TinyNAS模型蒸馏教程&#xff1a;小模型训练指南 想让轻量级模型达到接近大模型的精度&#xff1f;模型蒸馏技术就是你的不二选择 1. 引言 在实际的目标检测项目中&#xff0c;我们经常面临这样的困境&#xff1a;大模型精度高但推理慢&#xff0c;小模型速度快但精…...

TensorFlow.js推理超快

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 TensorFlow.js推理速度革命&#xff1a;构建超快Web端AI应用的实践与未来目录TensorFlow.js推理速度革命&#xff1a;构建超快We…...