springboot相关的一些知识
SpringBoot可以同时处理多少请求
SpringBoot默认的内嵌容器是Tomcat,所以SpringBoot可以同时处理多少请求取决于Tomcat。
SpringBoot中处理请求数量相关的参数有四个:
- server.tomcat.thread.min-spare:最少的工作线程数,默认大小是10。
- server.tomcat.thread.max:最大的工作线程数,默认大小是200。
- server.tomcat.max-connection:最大连接数,默认大小是8192。
- server.tomcat.accept-count:等待队列的昌都强,默认大小是100。
可根据实际需求调整这四个参数。
SpringBoot为什么要禁止循环依赖?
Spring的循环依赖是通过三级缓存实现的,非常复杂。就本身而言,对象之间的相互依赖就是一种不合理的设计,SpringBoot为了避免开发者使用这种不合理的设计,所以禁止了循环依赖。
在SpringBoot 2.6.0版本禁止循环依赖,但是可以通过配置的方式重新开启循环依赖。
Spring:main:allow-circular-refences: true
SpringBoot如何自定义Stater
-
创建项目:首先创建一个普通的maven项目,并且在pom文件中引入spring-boot-autoconfigure依赖,此依赖为SpringBoot自动配置机制的核心。
-
若是自定义的start涉及到属性的配置,也就是需要在YML中配置属性,则可以引入如下依赖
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version> <!-- 使用Spring Boot的最新稳定版 --><relativePath/> <!-- 查找父POM的位置 --></parent><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><!--此依赖可以使得自定义的属性可以在yml界面有提示--><optional>true</optional></dependency>
-
创建自定义starter的核心:自动配置类。该类可以自动完成Bean的注册, 它通常使用
@Configuration
、@EnableAutoConfiguration
和@ComponentScan
。package com.zxw.test;@Configuration @ConditionalOnClass(value = {HelloService.class}) @EnableConfigurationProperties(value = HelloProperties.class) public class HelloAutoConfiguration {@Autowiredprivate HelloProperties helloProperties;@Bean@ConditionalOnMissingBean(HelloService.class)public HelloService helloService() {HelloService helloService = new HelloService();helloService.setName(helloProperties.getName());return helloService;}}
-
创建属性配置类: 通常,自动配置类会配合一个属性配置类,使用
@ConfigurationProperties
注解来绑定配置文件中的属性。package com.zxw.test;@ConfigurationProperties(prefix = "hello-stater")//prefix属性配置的值为yml配置文件中配置属性的前缀。例如该条属性需配置则是 hello-stater.name="xxx" public class HelloProperties {private static final String DEFAULT_NAME = "helloWorld";private String name = DEFAULT_NAME;public String getName() {return name;}public void setName(String name) {this.name = name;}
-
创建业务类:该类一般用于定义该Start的主要功能
package com.zxw.test; public class HelloService {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public String hello(){return "hello,"+this.name;} }
-
更新
spring.factories
文件: 在src/main/resources/META-INF/spring.factories
文件中,添加你的自动配置类,以便Spring Boot能够发现它们。 (注意前缀必须为“org.springframework.boot.autoconfigure.EnableAutoConfiguration”)org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.zxw.config.HelloAutoConfiguration
SpringBoot的启动原理
- 运行Main方法:应用程序的启动始于Main方法的执行。在Main方法中,首先创建了一个Application的示例,用于调用Application的run方法。创建实例的过程中,会确定应用程序的类型,并且根据spring.factories文件加载所有的初始化器以及监听器。最后设置Main方法存在的类为主类。
- run()方法:run方法是SpringBoot程序启动的入口,以下是run方法的主要步骤:
- 首先run方法会通过prepareEnviroment方法读取和解析环境变量、配置文件(application.yml或者是application.properties)等,获取应用程序的配置信息。
- **之后会创建ApplicationContext(spring应用上下文):**springboot通过createApplicationContext更具应用程序的类型(如web类型)创建不同的ApplicationContext。web应用程序通常创建的是ServletWebServerApplicationContext.
- **预初始化上下文:**调用prepareContext()方法,进行预初始化上下文。其中会调用new Application中设置的初始化器进行初始化。并且会将SpringBoot启动类作为配置类,读取并注册BeanDefinition,使Spring容器可以识别应用程序的配置。
- **调用refresh:**通过调用此方法来加载和初始化Spring容器。这一过程会执行一系列操作,包括解析@Import注解以加载自动配置类,创建和注册BeanDefinition等。并且SpringBoot会在此方法中创建内置的Servlet容器。
- **监听器和扩展点:**在整个启动过程中,SpringBoot会调用各种监听器和扩展点,这些组件可以用来对应用程序进行扩展和定制。
SpringBoot内置Tomcat启动流程
SpringBoot内置Tomcat启动流程要从main函数入手,而main函数中的run()方法实际上是调用SpringApplication的run()方法。在run()方法中,先创建一个ConfigurableApplicationContext对象,通过createApplicationContext()对象进行创建,这个对象实际上就是JavaWeb的Applicationcontext对象。然后调用refreshcontext0)方法,在该方法中,又调用了refresh()方法,此方法中定义了Tomca创建流程,调用ServletWebServerApplicationcontext的onRefresh()方法,在该方法中调用了createWebsever)方法,在该方法中先获取ServletWebServerFactory,再根据工厂获取具体的webServer,此时获取的是TomcatServletWebServerFacotry这个工厂,然后在getWebServer0)方法中,创建Tomcat的一些核心组件,然后调用getTomcatWebServer)方法,进行初始化Tomcat,最后调用refresh()中的finishRefresh()方法,该方法被ServletWebServerApplicatonContext子类重写,在该方法中调用start()方法将Tomcat启动。
springBoot的jar包为什么可以直接运行?
- SpringBoot提供Maven插件(spring-boot-maven-plugin),用于将应用程序打包为可执行的Jar文件。通过执行mvn clean package等命令,可轻松生成可执行jar包。
- 打包生成的jar包通常是“fat jar”或“uber jar”,这意味着它包含了应用程序的所有依赖项。包含第三方库和SpringBoot框架本身。这样Jar文件就成为了一个自包含的单一文件。
- Jar文件包含一个MANIFEST.MF的清单文件,其中包含了Jar文件的元数据信息。其中最重要的是Main-class,它制定了启动应用程序的主类。
- springboot的可执行Jar文件通常由JarLauncher类启动。JarLauncher负责创建一个类加载器(LaunchedURLClassLoader),加载boot-lib目录下的Jar文件。包括SpringBoot的相关类。然后再一个新的线程中启动应用程序的Main方法,实现应用程序的启动。
- 当执行Main方法最终会加载Spring容器、进而创建内嵌的Tomact进行阻塞线程使我们Jar包完成web应用的启动。
SpringBoot的自动配置原理
- 引入@EnableAutoConfiguration:在SpringBoot的启动类上 会有@SpringBootApplication注解,该注解为一个复合注解,包含了@EnableAutoConfiguration注解,该注解标识了开启自动配置功能。
- @EnableAutoConfiguration注解引用了@Import注解,该注解的作用为导入一个实现了ImportSelector接口的类AutoConfigurationImportSelector 。该类用来决定哪些自动配置类应该被添加到Spring应用上下文中 。并且该类间接的包含了一个deferreImportSelector,用于确保SpringBoot的自动配置类在最后加载,以方便扩展和覆盖。当Spring容器启动的时候会解析@Import注解并加载相应的配置。
- 读取 META-INF/spring.factories 文件:SpringBoot通过SPI机制读取类路径下的 META-INF/spring.factories 文件,该文件包含了各种自动配置类的配置。
- 过滤出AutoConfigurationClass:从spring.factories 文件中,过滤出所有AutoConfigurationClass类型的类,这些类包含了自动配置的具体实现。
- 条件化加载:最后SpringBoot会根据条件(@ConditionalXXX注解)来排除包含特定功能的自动配置类。这些条件会根据应用程序的环境和配置动态生效。
总结起来,Spring Boot的自动配置原理是通过@EnableAutoConfiguration注解引入自动配置逻辑,然后解析@lmport注解,加载各种配置类,包括deferredlmportSelector和自动配置类。通过SPI机制读取spring.factories文件,过滤出自动配置类,并根据条件化配置来动态加载这些类,从而实现自动配置的功能。这种机制使得Spring Boot应用程序可以根据环境和需求自动配置,极大地简化了开发和部署的工作。
SpringBoot和Spring的关系和区别
关系:
- Spring是框架 而SpringBoot是脚手架:Spring是一个Java应用程序框架,旨在帮助开发人员构建各种类型的应用程序,包括web应用、企业级应用等。Spring提供了大量的组件和功能,但需要开发人员进行详细配置和集成。SpringBoot则是一个脚手架工具,基于Spring框架,旨在简化Spring应用程序的初始化配置和开发过程,采用自动化配置和约定大于配置的特性。
- SpringBoot构建在Spring之上:SpringBoot不是一个框架而是建立在Spring之上的工具。使用了Spring的核心功能,如依赖注入、面向切面编程、事务管理等。因此SpringBoot狂热一充分利用Spring框架的功能,并且更容易启动和运行。
区别:
- 配置方式:Spring的配置通常需要大量的XML配置文件或者是JAVA注解。相比之下SpringBoot采用“约定大于配置”的原则,大部分配置都可以通过默认值和自动配置来完成,从而减少了配置的复杂性。
- 开发速度:SpringBoot降低了学习曲线,提供了内置的Starter和自动配置,使得开发更加快速和高校。而Spring更多的是使用手动配置。
- 内置web容器:SpringBoot内置了多个内嵌式的web容器,可以轻松创建独立可执行的JAR文件或者是WAR文件,而不需要外部web服务器。Spring通常需要外部web服务器的部署。
总的来说,Spring是一个全功能的Java应用程序框架,而Spring Boot是一个用于简化Spring应用程序开发的工具。Spring Boot通过自动化配置、约定优于配置的原则、内置Web容器等功能,使得开发和部署Spring应用程序变得更加快速和便捷,特别适用于微服务和快速原型开发。开发人员可以根据项目的需求选择使用Spring框架、Spring Boot,或两者结合使用。
对SpringBoot的理解
- 内置Starter和自动配置:Spring Boot提供丰富的内置Starter,这些Starter是预定义的依赖集合,可以轻松集成各种主流框架技术。同时,Spring Boot通过自动配置大大减少了繁琐的配置工作,让开发人员可以直接开箱即用。
- **零XML配置:**Spring Boot采用JavaConfig的方式进行开发,不需要编写大量的XML配置文件。这种开发方式让开发更加简洁和可读,同时提高了可维护性。
- **内置web容器:**SpringBoot内置了多个内嵌式的web容器,可以轻松创建独立可执行的JAR文件或者是WAR文件,而不需要外部web服务器,简化了部署过程。
- **微服务的支持:**SpringBoot和SpringCloud结合使用,可以轻松快速的构建和部署微服务架构。
- 依赖版本管理:SpringBoot帮助开发人员管理了常用的第三方依赖版本,防止出现版本冲突问题。
- 监控管理:SpringBoot自带了监控功能,包括应用程序状况监控、内存使用情况监控、线程池状态、HTTP请求统计等。除此之外,SpringBoot还提供了优雅关闭程序的方式,使得应用程序管理更加便捷。
总的来说,Spring Boot旨在提供一个快速、高效、开箱即用的开发环境,使开发人员能够更加专注于业务逻辑的实现而不必花费太多时间在繁琐的配置和集成上。它的设计理念是"约定优于配置",通过合理的默认配置和内置功能,让开发变得更加简单和愉快。
相关文章:

springboot相关的一些知识
SpringBoot可以同时处理多少请求 SpringBoot默认的内嵌容器是Tomcat,所以SpringBoot可以同时处理多少请求取决于Tomcat。 SpringBoot中处理请求数量相关的参数有四个: server.tomcat.thread.min-spare:最少的工作线程数,默认大小…...

DP:完全背包+多重背包问题
完全背包和01背包的区别就是:可以多次选 一、完全背包(模版) 【模板】完全背包_牛客题霸_牛客网 #include <iostream> #include<string.h> using namespace std; const int N1001; int n,V,w[N],v[N],dp[N][N]; //dp[i][j]表示…...
购物返利系统的安全性:防范欺诈与数据保护
购物返利系统的安全性:防范欺诈与数据保护 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 购物返利系统作为一种电子商务模式,通过向消…...

从WebM到MP3:利用Python和wxPython提取音乐的魔法
前言 有没有遇到过这样的问题:你有一个包含多首歌曲的WebM视频文件,但你只想提取其中的每一首歌曲,并将它们保存为单独的MP3文件?这听起来可能有些复杂,但借助Python和几个强大的库,这个任务变得异常简单。…...

图片转pdf,图片转pdf在线转换,在线图片转pdf
图片转PDF,听起来似乎是一个简单的操作,但实际上,它涉及到许多细节和技巧。有时候我们需要将图片转换为PDF格式,以便于分享、打印或保存。那么,如何将图片转换成PDF呢?接下来,我将为您详细介绍几…...
SpringBoot3使用Swagger3
SpringBoot3使用Swagger3 项目中的后端接口进行简单的前端展示一、依赖引入二、快速启动1.在application.yml中配置2.或者properties文件,则配置3.启动项目访问swagger 三、使用注解标注接口Swagger配置文件Swagger 注解迁移举例五种常用ApiApiOperationApiImplicitParamApiMod…...

【51单片机基础教程】点亮led
文章目录 前言51单片机点亮LED的原理硬件部分软件部分51单片机的寄存器编程步骤proteus仿真点亮一个led 点亮多个ledproteus仿真代码 流水灯 总结 前言 单片机(Microcontroller Unit, MCU)是一种集成电路,广泛应用于各种电子产品中。作为嵌入…...

Docker之overlay2的迁移
原因 docker默认将文件及其容器放置在了系统盘的挂载区内,如果长期使用会发现系统挂载区被overlay2挤爆了,因此在一开始我们将其迁移在大容量外挂磁盘上,就可以避免系统盘被挤爆,放心使用. 具体操作 # 停止容器 systemctl stop docker# 修改容器配置,…...
CentOS中的rename命令
目录 CentOS中的rename命令基本语法使用示例注意事项安装prename CentOS中的rename命令 在CentOS系统中,rename命令通常是指util-linux包中提供的版本,它用于批量重命名文件,但与Perl版本的rename命令相比,功能较为简单ÿ…...

redis.conf 参数详解,方便进行性能优化配置
以下是redis.conf中一些常见参数的详细说明: daemonize:是否以后台进程运行,默认为no; pidfile:如以后台进程运行,则需指定一个pid,默认为/var/run/redis.pid;bind:绑定主…...

微信小程序登录流程详情及Java代码
一、流程图 说明: 调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。 调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 和 会话密钥 session_key。 获取手机号,调用wx.getPhoneNumber() ,获取加密…...

c++qt合并两张灰度图像
需求:将两张尺寸相同的灰度图像进行合并,合并后的图像,每个像素点灰度值为两张原图对应像素点灰度值之和。若超过255,则最大为255。 方法一: 将图像读取为cv::Mat,再调用opencv的cv::add方法,进…...

Uniapp通过年月日时间转变星期格式
效果图 参靠微信小程序:日常记一记 代码 <view v-for"(d,index) in dataList" >{{getWeekDay(d.ctime)}} //时间格式:2024-06-21</view> js export default {data(){return {dataList:[],//时间数组}},onLoad() {this.loadList…...
如何编写和执行高效的测试计划
如何编写和执行高效的测试计划 1. 测试计划概述2. 测试阶段详解3. 测试计划模板4. 关键注意事项总结 1. 测试计划概述 测试计划是指导整个测试过程的重要文档,其中包含了测试策略、资源分配、进度安排以及风险评估等内容。 一个完善的测试计划应当包括以下几个主要…...

【MySQL连接器(Python)指南】03-MySQL连接器(Python)安装
文章目录 前言1. 从二进制发行版中安装连接器1.1 使用pip安装MySQL连接器1.2 使用MySQL Yum Repository安装1.3 使用Debian软件包安装连接器2. 从源代码发行版安装连接器2.1 在Windows上源码安装2.2 在类Unix系统上源码安装3. 验证连接器安装总结前言 MySQL连接器(Python),用于…...

Spring Boot组件化与参数校验
Spring Boot组件化与参数校验 Spring Boot版本选择 2.3.x版本 2.6.x版本 Spring Boot核心思想 约定大于配置,简化繁琐的配置 Spring Boot自动配置原理 SpringBootApplication: Spring Boot应用标注在某个类上说明这个类是SpringBoot的主配置类,Spr…...
实现可扩展的电商返利平台:技术选型与挑战
实现可扩展的电商返利平台:技术选型与挑战 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在当今数字化和电商兴盛的时代,返利平台成为…...

从0开始C++(三):构造函数与析构函数详解
目录 构造函数 构造函数的基本使用 构造函数也支持函数重载 构造函数也支持函数参数默认值 构造初始化列表 拷贝构造函数 浅拷贝和深拷贝 析构函数 总结 练习一下ヽ( ̄▽ ̄)ノ 构造函数 构造函数的基本使用 构造函数是一种特殊的成…...

行车记录仪文件夹“0字节”现象解析与恢复策略
一、行车记录仪文件夹“0字节”现象描述 行车记录仪作为现代驾驶中的必备设备,其储存的视频数据对于事故记录和取证至关重要。然而,有时车主们可能会遇到这样一个问题:行车记录仪的某个文件夹内的文件突然变成了0字节大小,无法正…...
呼叫中心系统的功能都有哪些?okcc呼叫中心pscc磐石云呼叫系统部署
当前电话营销普及到各行各业,方便快捷成了大部分企业在宣传自己公司的产品时必用的一种营销方式,但是电话营销在管理上也存在许多问题。例如:销售员与客户沟通前,未能详细了解客户的资料;多名销售员重复拨打同一个客户…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...

企业大模型服务合规指南:深度解析备案与登记制度
伴随AI技术的爆炸式发展,尤其是大模型(LLM)在各行各业的深度应用和整合,企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者,还是积极拥抱AI转型的传统企业,在面向公众…...