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