springboot相关的一些知识

SpringBoot可以同时处理多少请求

SpringBoot默认的内嵌容器是Tomcat,所以SpringBoot可以同时处理多少请求取决于Tomcat。

SpringBoot中处理请求数量相关的参数有四个:

  1. server.tomcat.thread.min-spare:最少的工作线程数,默认大小是10。
  2. server.tomcat.thread.max:最大的工作线程数,默认大小是200。
  3. server.tomcat.max-connection:最大连接数,默认大小是8192。
  4. server.tomcat.accept-count:等待队列的昌都强,默认大小是100。

可根据实际需求调整这四个参数。

SpringBoot为什么要禁止循环依赖?

Spring的循环依赖是通过三级缓存实现的,非常复杂。就本身而言,对象之间的相互依赖就是一种不合理的设计,SpringBoot为了避免开发者使用这种不合理的设计,所以禁止了循环依赖。

在SpringBoot 2.6.0版本禁止循环依赖,但是可以通过配置的方式重新开启循环依赖。

Spring:main:allow-circular-refences: true
SpringBoot如何自定义Stater
  1. 创建项目:首先创建一个普通的maven项目,并且在pom文件中引入spring-boot-autoconfigure依赖,此依赖为SpringBoot自动配置机制的核心。

  2. 若是自定义的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>
    
  3. 创建自定义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;}}
    
  4. 创建属性配置类: 通常,自动配置类会配合一个属性配置类,使用@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;}
    
  5. 创建业务类:该类一般用于定义该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;}
    }
    
  6. 更新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的启动原理

在这里插入图片描述

  1. 运行Main方法:应用程序的启动始于Main方法的执行。在Main方法中,首先创建了一个Application的示例,用于调用Application的run方法。创建实例的过程中,会确定应用程序的类型,并且根据spring.factories文件加载所有的初始化器以及监听器。最后设置Main方法存在的类为主类。
  2. 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包为什么可以直接运行?
  1. SpringBoot提供Maven插件(spring-boot-maven-plugin),用于将应用程序打包为可执行的Jar文件。通过执行mvn clean package等命令,可轻松生成可执行jar包。
  2. 打包生成的jar包通常是“fat jar”或“uber jar”,这意味着它包含了应用程序的所有依赖项。包含第三方库和SpringBoot框架本身。这样Jar文件就成为了一个自包含的单一文件。
  3. Jar文件包含一个MANIFEST.MF的清单文件,其中包含了Jar文件的元数据信息。其中最重要的是Main-class,它制定了启动应用程序的主类。
  4. springboot的可执行Jar文件通常由JarLauncher类启动。JarLauncher负责创建一个类加载器(LaunchedURLClassLoader),加载boot-lib目录下的Jar文件。包括SpringBoot的相关类。然后再一个新的线程中启动应用程序的Main方法,实现应用程序的启动。
  5. 当执行Main方法最终会加载Spring容器、进而创建内嵌的Tomact进行阻塞线程使我们Jar包完成web应用的启动。
SpringBoot的自动配置原理
  1. 引入@EnableAutoConfiguration:在SpringBoot的启动类上 会有@SpringBootApplication注解,该注解为一个复合注解,包含了@EnableAutoConfiguration注解,该注解标识了开启自动配置功能。
  2. @EnableAutoConfiguration注解引用了@Import注解,该注解的作用为导入一个实现了ImportSelector接口的类AutoConfigurationImportSelector 。该类用来决定哪些自动配置类应该被添加到Spring应用上下文中 。并且该类间接的包含了一个deferreImportSelector,用于确保SpringBoot的自动配置类在最后加载,以方便扩展和覆盖。当Spring容器启动的时候会解析@Import注解并加载相应的配置。
  3. 读取 META-INF/spring.factories 文件:SpringBoot通过SPI机制读取类路径下的 META-INF/spring.factories 文件,该文件包含了各种自动配置类的配置。
  4. 过滤出AutoConfigurationClass:从spring.factories 文件中,过滤出所有AutoConfigurationClass类型的类,这些类包含了自动配置的具体实现。
  5. 条件化加载:最后SpringBoot会根据条件(@ConditionalXXX注解)来排除包含特定功能的自动配置类。这些条件会根据应用程序的环境和配置动态生效。

总结起来,Spring Boot的自动配置原理是通过@EnableAutoConfiguration注解引入自动配置逻辑,然后解析@lmport注解,加载各种配置类,包括deferredlmportSelector和自动配置类。通过SPI机制读取spring.factories文件,过滤出自动配置类,并根据条件化配置来动态加载这些类,从而实现自动配置的功能。这种机制使得Spring Boot应用程序可以根据环境和需求自动配置,极大地简化了开发和部署的工作。

SpringBoot和Spring的关系和区别

关系:

  1. Spring是框架 而SpringBoot是脚手架:Spring是一个Java应用程序框架,旨在帮助开发人员构建各种类型的应用程序,包括web应用、企业级应用等。Spring提供了大量的组件和功能,但需要开发人员进行详细配置和集成。SpringBoot则是一个脚手架工具,基于Spring框架,旨在简化Spring应用程序的初始化配置和开发过程,采用自动化配置和约定大于配置的特性。
  2. SpringBoot构建在Spring之上:SpringBoot不是一个框架而是建立在Spring之上的工具。使用了Spring的核心功能,如依赖注入、面向切面编程、事务管理等。因此SpringBoot狂热一充分利用Spring框架的功能,并且更容易启动和运行。

区别:

  1. 配置方式:Spring的配置通常需要大量的XML配置文件或者是JAVA注解。相比之下SpringBoot采用“约定大于配置”的原则,大部分配置都可以通过默认值和自动配置来完成,从而减少了配置的复杂性。
  2. 开发速度:SpringBoot降低了学习曲线,提供了内置的Starter和自动配置,使得开发更加快速和高校。而Spring更多的是使用手动配置。
  3. 内置web容器:SpringBoot内置了多个内嵌式的web容器,可以轻松创建独立可执行的JAR文件或者是WAR文件,而不需要外部web服务器。Spring通常需要外部web服务器的部署。

总的来说,Spring是一个全功能的Java应用程序框架,而Spring Boot是一个用于简化Spring应用程序开发的工具。Spring Boot通过自动化配置、约定优于配置的原则、内置Web容器等功能,使得开发和部署Spring应用程序变得更加快速和便捷,特别适用于微服务和快速原型开发。开发人员可以根据项目的需求选择使用Spring框架、Spring Boot,或两者结合使用。

对SpringBoot的理解
  1. 内置Starter和自动配置:Spring Boot提供丰富的内置Starter,这些Starter是预定义的依赖集合,可以轻松集成各种主流框架技术。同时,Spring Boot通过自动配置大大减少了繁琐的配置工作,让开发人员可以直接开箱即用。
  2. **零XML配置:**Spring Boot采用JavaConfig的方式进行开发,不需要编写大量的XML配置文件。这种开发方式让开发更加简洁和可读,同时提高了可维护性。
  3. **内置web容器:**SpringBoot内置了多个内嵌式的web容器,可以轻松创建独立可执行的JAR文件或者是WAR文件,而不需要外部web服务器,简化了部署过程。
  4. **微服务的支持:**SpringBoot和SpringCloud结合使用,可以轻松快速的构建和部署微服务架构。
  5. 依赖版本管理:SpringBoot帮助开发人员管理了常用的第三方依赖版本,防止出现版本冲突问题。
  6. 监控管理:SpringBoot自带了监控功能,包括应用程序状况监控、内存使用情况监控、线程池状态、HTTP请求统计等。除此之外,SpringBoot还提供了优雅关闭程序的方式,使得应用程序管理更加便捷。

总的来说,Spring Boot旨在提供一个快速、高效、开箱即用的开发环境,使开发人员能够更加专注于业务逻辑的实现而不必花费太多时间在繁琐的配置和集成上。它的设计理念是"约定优于配置",通过合理的默认配置和内置功能,让开发变得更加简单和愉快。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/31278.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8小时出500杯,投诉三次辞退?Manner逼疯员工…?

一边歇斯底里的咆哮&#xff1a;「你投诉啊」&#xff01;一边将咖啡粉泼向顾客……一场大战要不是隔着岛台&#xff0c;就真的燃起来了……‍ 好巧不巧&#xff0c;同一天&#xff0c;另一段视频中的顾客就没那么好运了&#xff0c;男店员冲上去就给女顾客一个耳光……‍‍ 想…

HUSKY:一个优化大语言模型多步推理的新代理框架

推理被高度认可为生成人工智能的下一个前沿领域。通过推理&#xff0c;我们可以将任务分解为更小的子集并单独解决这些子集。例如以前的论文&#xff1a;思维链、思维树、思维骨架和反射&#xff0c;都是最近解决LLM推理能力的一些技术。此外推理还涉及一些外围功能&#xff0c…

GPT-4o目前暂无音频输出的能力

OpenAI的发布会惊艳的操作&#xff0c;近乎实时的语音对话&#xff0c;让很多人向往。 但实际上Chat对话时&#xff0c;尚无输出音频的能力&#xff0c;可能还未开放。 这是国外的一个开发小哥的交流帖子&#xff0c;可能还需要些时日才能用的上实时的音频输出。 不过当前Op…

OpenGL Super Bible 7th-Primitives, Pipelines, and Pixels图元、渲染管线与像素

简介 本文的原版为《OpenGL Super Bible 7th》,是同事给我的,翻译是原文+译文的形势。文章不属于机器直译,原因在于语言不存在一一对应的关系,我将尽可能的按照中国人看起来舒服的方式来翻译这些段子,如果段子让你感到身心愉悦,那还劳烦点个关注,追个更。如果我没有及时…

如何解决压缩软件无法打开文件的常见问题

压缩软件是我们日常生活和工作中常用的工具&#xff0c;无论是传输文件、节省存储空间还是组织数据&#xff0c;它们都能发挥重要作用。然而&#xff0c;偶尔也会遇到压缩软件无法打开文件的情况&#xff0c;这可能令人困惑和沮丧。本文将探讨几种常见原因&#xff0c;并提供解…

模板类与继承

1模板类继承普通类&#xff08;常见&#xff09; #include<iostream> using namespace std; class AA { public:int m_a;AA(int a) :m_a(a) { cout << "调用了AA的构造函数\n"; }void func1() { cout << "调用func1&#xff08;&#xff09;…

Zookeeper 集群如何实现数据一致性和顺序性原理?

Zookeeper 集群如何实现数据一致性和顺序性原理? 在 Zookeeper 集群中,确保数据的完整性和一致性是其核心功能之一。Zookeeper 通过一套分布式 协调机制来保证在多节点环境下,所有节点的数据是一致的,即使在网络分区或节点故障的情况下,依 然能够提供一致性服务。以下是实…

Ubuntu 20.04安装显卡驱动、CUDA和cuDNN(2024.06最新)

一、安装显卡驱动 1.1 查看显卡型号 lspci | grep -i nvidia我们发现输出的信息中有Device 2230&#xff0c;可以根据这个信息查询显卡型号 查询网址&#xff1a;https://admin.pci-ids.ucw.cz/mods/PC/10de?actionhelp?helppci 输入后点击Jump查询 我们发现显卡型号为RTX …

双阶段目标检测算法

双阶段目标检测算法 本文将系统的过一遍双阶段目标检测的经典算法&#xff0c;文献阅读顺序如下&#xff1a; R-CNN → \rightarrow → SPPnet → \rightarrow → Fast R-CNN → \rightarrow → Faster R-CNN → \rightarrow → Mask R-CNN R-CNN 一、研究背景 R-CNN可…

PHP转Go系列 | 条件循环的使用姿势

大家好&#xff0c;我是码农先森。 条件 在 PHP 语言中条件控制语句&#xff0c;主要有 if、elseif、else 和 switch 语句 // if、elseif、else 语句 $word "a"; if ($word "a") {echo "a"; } elseif ($word "b") {echo "b&…

java程序乱码的问题

【问题点】 我的需求是对接别的系统的接口&#xff0c;然后别的系统传过来的数据是utf8,然后我自己的系统是gbk字符集&#xff0c;同理其他的字符集也可以这么处理 多种方法&#xff1a; 如果你的系统字符集是 GBK&#xff0c;而需要处理来自其他系统接口的 UTF-8 编码数据&…

手机怎么恢复回收站清空的照片?这里有找回相册的3个重要指南

生活里&#xff0c;从家庭聚会的美好瞬间到重要的工作文件&#xff0c;都在我们的手机相册中留下了痕迹。然而意外常常降临&#xff0c;这些数据也有可能突然消失不见&#xff0c;并且恢复回收站清空的照片失败的情况也不少见。请别着急&#xff0c;在这篇文章中&#xff0c;我…

第三十一篇-Ollama+OneAPI基本集成配置

本文介绍使用oneapiollama实现openai接口实现 环境要求 Docker version 26.1.3 具体安装熟悉的&#xff0c;百度安装oneapi mkdir /home/oneapi/data docker run --name one-api -d --restart always -p 3000:3000 -e TZAsia/Shanghai -v /home/oneapi/data:/data justsong/…

教师工资管理系统(python,save保存文件)

我大学上课的时候老师还让写python程序代码&#xff0c;我选了个教师工资管理系统的课题&#xff0c;因为这个选的人少。虽然有一周的准备时间&#xff0c;我还是选择了在提交的前一天的下午开始做&#xff0c;做到了第二天的三点才写完。 这是条件 选题八&#xff1a;教师工资…

微信小程序修改标题

要修改微信小程序页面的标题和调整字体大小&#xff0c;你需要对 app.json 和页面对应的 json 文件进行配置。 修改页面标题 打开 app.json 文件&#xff0c;找到 pages 字段&#xff0c;确认需要修改的页面路径。打开对应页面的 .json 文件&#xff08;例如&#xff0c;pages/…

CentOS7设置自动定时重启

1.编辑启用配置文件 vi /etc/crontab 2.设置定时任务 SHELL/bin/bash PATH/sbin:/bin:/usr/sbin:/usr/bin MAILTOroot # 详细使用方法# 工作定义示例:# .---------------- 分钟 (0 - 59)# | .------------- 小时 (0 - 23)# | | .---------- 一个月中的第几天 (1 - 31)# …

React/Vue项目-请求文件封装(Axios,WebSocket)

一、Axios 1、Axios封装&#xff08;request.js&#xff09; import axios from "axios";// 开发环境配置 const baseURL "/api";// 生产环境配置 // const baseURL http://192.168.0.1:9000// 创建axios实例 const http axios.create({baseURL: base…

【Android】代码中将 SVG 图像转换颜色

要在代码中将 SVG 图像转换为黑色&#xff0c;你可以使用一个库&#xff0c;例如 AndroidSVG 或 SVG-Android。以下是一个简单的示例代码&#xff0c;展示了如何通过代码方式将 SVG 图像改为黑色&#xff1a; // 导入 AndroidSVG 库 import com.caverock.androidsvg.SVG; impo…

【docker】常用指令-表格整理

以下列出的指令是Docker中常用的命令&#xff0c;但并不是全部。Docker的指令非常丰富&#xff0c;可以根据具体的需求和场景选择合适的指令。同时&#xff0c;每个指令都有很多选项和参数可以使用&#xff0c;可以通过 docker COMMAND --help 来获取更详细的信息。 一、容器命…

LeetCode刷题之HOT100之LRU缓存

2024/6/21 酷暑难耐&#xff0c;离开空调我将不知道能否《活着》&#xff0c;昨天跑步感觉全身的热无法排出去&#xff0c;出门那种热浪一阵一阵打过来&#xff0c;一点风都舍不得给我。早早的来到实验室&#xff0c;也没多早&#xff0c;九点哈哈&#xff0c;做题啦&#xff0…