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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

表单中的常用元素

10.图像形式上传文件 <input type“image”>定义图像形式的提交。 src 属性和alt属性必须与<input type“image””>结合使用。 input type"image"src"img/l.jpg"alt"submit"/> 11.下拉列表框 <select>标签定义下拉列表框…

ubuntu 20.04禁止自动更新内核驱动、显卡驱动(使用命令行)

本文目录 一、禁止更新内核1.1 查看当前内核1.2 查看安装的内核1.3 根据需求&#xff0c;使用hold参数禁止固定内核1.4 查询被锁定不更新软件包的状态 二、禁止更新显卡驱动2.1 查看安装的显卡驱动2.2 查看详细的详细的显卡信息2.3 禁止显卡驱动更新2.4 查询显卡是否设置成功 前…

EE trade:现货黄金杠杆比例的计算方法

现货黄金杠杆交易是一种利用保证金进行交易的方式&#xff0c;允许投资者用较少的资金控制较大的交易量&#xff0c;从而放大收益或损失。杠杆比例的计算方法相对简单&#xff0c;主要取决于交易所需的保证金和实际交易金额之间的关系。 杠杆比例的计算公式 杠杆比例 实际交…

SoC设计更重要的是IP管理

对于大多数片上系统&#xff08;SoC&#xff09;设计来说&#xff0c;最关键的任务不是RTL编码&#xff0c;甚至不是创建芯片架构。今天&#xff0c;SoC的设计主要使用来自多个供应商的各种IP块。这使得管理硅IP成为SoC设计过程中的主要任务。 一般来说&#xff0c;新编写的RTL…

【挑战100天首通《谷粒商城》】-【第一天】【10 番外篇】 解决docker 仓库无法访问 + MobaXterm连接VirtualBox虚拟机

文章目录 课程介绍 1、解决docker 仓库无法访问 2、 MobaXterm连接VirtualBox虚拟机 Stage 1&#xff1a;下载MobaXterm选择适合你的版本 Stage 2&#xff1a;vagrant ssh 连接&#xff0c;开启ssh访问 Stage 2-1&#xff1a;su获取root账号权限,输入密码&#xff08;默认vagra…

微软修复Wi-Fi驱动高危漏洞 影响Windows所有版本 可通过局域网发起攻击

微软修复 WiFi 驱动程序中的高危安全漏洞&#xff0c;该漏洞影响 Windows 所有版本&#xff0c;可以通过公共 WiFi 等发起攻击。如果攻击者能够接入到目标设备所处的网络中&#xff0c;则可以悄无声息完成攻击&#xff0c;不需要用户进行任何交互。 在本月例行安全更新中微软修…

深入理解@EnableAspectJAutoProxy

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

【分享】WinRAR如何加密压缩文件?

WinRAR除了用来解压缩文件&#xff0c;还可以作为一款加密软件&#xff0c;给压缩文件设置密码保护&#xff0c;今天一起来看看&#xff0c;WinRAR的3种加密方法。 方法1&#xff1a;设置单次加密 如果偶尔需要给压缩文件设置密码&#xff0c;可以使用单次加密方法。 首先&am…

Spring技术——介绍、初识

从这篇博客正式开始学习 Spring 。 一、整个Spring技术学习的介绍 首先先对 Spring 做一个简单的认识&#xff0c;并从以下3个方面了解学习Spring 技术的意义&#xff1a; &#xff08;1&#xff09;为什么要学习 Spring 技术&#xff1f; 1、它的市场的占有率很高&#xff…

【AI工具】探索创意与效率:xs.tools 网站介绍

在这个数字化时代,工具的创新和效率对我们的日常工作和生活至关重要。"xs.tools" 网站是一个汇集了众多有趣且实用的小工具的平台,它不仅帮助用户快速找到所需的工具,还能激发灵感,提升创造力。 一、网站概览 "xs.tools" 提供了一个简洁而直观的界面…

阻塞队列:ArrayBlockingQueue和LinkedBlockingQueue区别

文章目录 1、阻塞队列具有以下特点&#xff1a;2、以下是几个常见的应用场景3、ArrayBlockingQueue和LinkedBlockingQueue区别 阻塞队列(BlockingQueue)是一种特殊类型的队列&#xff0c;它用于在多线程环境中实现线程之间的通信。 阻塞队列的实现通常依赖于底层的锁机制和条件…

展厅设计要遵守哪些原则

1、定位要准确 企业文化展厅是比较稳固的&#xff0c;是长期的存在于企业管理内部的&#xff0c;因此在企业展厅设计的时候需要有正确的定位&#xff0c;要从传统工艺&#xff0c;选材&#xff0c;设计风格和价格等的方面&#xff0c;进行一个整体的分析&#xff0c;能准确的掌…

Spring和SpringBoot(概述与功能)

目录 一、SpringBoot 概念 &#xff08;1&#xff09;基本介绍 &#xff08;2&#xff09;部分注解 &#xff08;3&#xff09;其它介绍 ​编辑 二、 Spring 缺点 &#xff08;1&#xff09;配置繁琐 &#xff08;2&#xff09;依赖繁琐 三、SpringBoot 功能&#xff0…

LDO电容选型指南

1 为什么电容的选择至关重要 电容往往被人们所忽视&#xff0c;在许多工程师的心目中&#xff0c;电容不过是两个导体加上中间的隔离电解质。总而言之&#xff0c;它们属于最低级的电子元件之一。 工程师们通常通过添加一些电容的办法来解决噪声问题。这是因为他们普遍将电容视…

EEtrade:现货黄金交易中的建仓指南

现货黄金是一种重要的投资方式&#xff0c;为投资者提供了良好的盈利环境。为了在这个市场中取得成功&#xff0c;投资者必须掌握建仓的技巧和策略。以下是有关如何进行现货黄金建仓的详细指南。 一、建仓基本概念 建仓&#xff0c;也叫开仓&#xff0c;是指在现货黄金交易中…

敏捷开发时代,彻底结束了

最近&#xff0c;我收到一位读者的私信&#xff0c;他最近“内耗”得非常厉害&#xff0c;他可能一时兴起把我的私信当作了吐槽箱。 他们公司一直实行敏捷的管理模式&#xff0c;复盘发现了一个问题&#xff1a;发布与迭代具有强相关性&#xff0c;一个迭代就发布一次&#xf…

C++语法13 单分支结构的相关问题详解

一、奇偶数问题 要判断一个数是否是偶数&#xff0c;只要判断这个数字能不能被2整除即可。如果一个数字a除以2&#xff0c;没有余数&#xff0c;那么就是偶数&#xff1b;如果除以2有余数&#xff0c;那么就是奇数。 if(a%20) a是偶数 if(a%21) a是奇数 训练&#xff1…

2-Matplotlib是什么

Matplotlib是什么 Matplotlib 是一款用于数据可视化的 Python 软件包&#xff0c;支持跨平台运行&#xff0c;它能够根据 NumPy ndarray 数组来绘制 2D 图像&#xff0c;它使用简单、代码清晰易懂&#xff0c;深受广大技术爱好者喜爱。 NumPy 是 Python 科学计算的软件包&…

【面试干货】常见的编译时异常(运行时异常)及其处理

【面试干货】常见的编译时异常&#xff08;运行时异常&#xff09;及其处理 1、SQLException2、IOException3、FileNotFoundException4、ClassNotFoundException5、EOFException6、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Jav…

背就有效!2024下《系统架构设计师》50个高频考点汇总

宝子们&#xff01;上半年软考已经结束一段时间了&#xff0c;准备备考下半年软考高级-系统架构设计师的小伙伴可以开始准备了&#xff0c;毕竟高级科目的难度可是不低的&#xff0c;相信参加过上半年架构的小伙伴深有体会。 这里给大家整理了50个高频考点&#xff0c;涵盖全书…