1、简单整体介绍
SpringBoot,顾名思义,关键在于Boot,Boot在计算机领域中拥有启动之含义,从而可得SpringBoot框架设计初衷:启动基于Spring生态圈的企业级应用,尽可能的简单快速高效地开发、部署和运行Spring应用程序,把开发者从各种纷繁复杂的XML配置和依赖管理中解放出来,使开发者能够全身心投入到业务逻辑代码的编写中,从而大大提高了开发效率,一定程度上缩短项目周期。
现如今微服务架构是"新常态",微服务使得不同团队专注于更小范围的业务领域,构建小型随时可运行的成千上万的应用程序更是成为微服务必须首先解决的问题,SpringBoot恰好为微服务框架的使用提供了更好的脚手架工具。
2、SpringBoot和SpringCloud区别
SpringBoot用于构建单个服务应用,微服务SpringCloud用于服务治理,也就是管理和协调多个微服务(SpringBoot应用程序),SpringCloud中包含了众多服务治理相关的组件:服务网关组件SpringCloud Gateway,负载均衡组件Ribbon,Rest客户端组件Feign,配置中心组件Config Server,断路器组件Circuit Breaker、服务注册和服务发现组件Eureka,监控组件Sleuth等等。
3、SpringBoot特点
SpringBoot官网描述的特点:
Create stand-alone Spring applications
Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files)
Provide opinionated 'starter' dependencies to simplify your build configuration
Automatically configure Spring and 3rd party libraries whenever possible
Provide production-ready features such as metrics, health checks, and externalized configuration
Absolutely no code generation and no requirement for XML configuration
-
创建内置Tomcat、Jetty和Undertow容器的独立应用程序,无需部署War文件,只需打成Jar包即可部署运行
-
通过提供Starter来简化应用构建时所需要的依赖,Starter是一组依赖项的集合,它们一起提供了一组功能,如需Web开发时引入spring-boot-starter-web即可,此Starter包括了所有构建Web应用程序所需的依赖项,并会自动引入相关的依赖,开发者还可以自定义Starter
-
基于引入的依赖Jar包和条件注解机制在Spring应用启动时能够自动配置Spring和第三方库的相关Bean对象
-
提供了可监控和管理SpringBoot应用的大量生产级特性,比如性能指标、健康检查、统计追踪等功能,可以轻松地了解应用程序的运行状况,可与Prometheus和Grafana整合使用
4、SpringBoot启动流程
5、自动装配原理
SpringBoot自动配置是基于Spring框架提供的Conditional条件注解机制实现的,当Spring应用启动时,会获取各jar包路径下的META-INF/spring.factories和META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件中的EnableAutoConfiguration类,并根据条件注解来判断获取到的自动配置类是否能够注册到Spring容器,从而实现自动配置。源代码在spring-boot-autoconfigure.jar包中。
- Spring应用主类被@SpringBootApplication注解,在SpringBootApplication注解中,又被@EnableAutoConfiguration所注解,表示此Spring应用能够自动配置
@SpringBootApplication
public class DemoApplication
@SpringBootConfiguration
@EnableAutoConfiguration
public @interface SpringBootApplication
- 在EnableAutoConfiguration注解中,被@Import(AutoConfigurationImportSelector.class)所注解,在主类被解析时能够获取到被导入的AutoConfigurationImportSelector类
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration
- 在AutoConfigurationImportSelector.selectImports()方法中,扫描所有jar包类路径下
META-INF/spring.factories和META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件自动配置类
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.ReactiveMultipartAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.WebSessionIdResolverAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration
每个以AutoConfiguration结尾的类都是一个自动配置类,拥有各种类型条件注解,只有满足特定条件后才可以被解析到Spring容器。
注解 | 描述 |
---|---|
@Conditional | 扩展注解作用(判断是否满足当前指定条件) |
@ConditionalOnBean | 容器中存在指定Bean |
@ConditionalOnClass | 容器中存在指定Class |
@ConditionalOnCloudPlatform | 指定特定云平台 |
@ConditionalOnExpression | 满足SpEL表达式 |
@ConditionalOnJava | 满足系统特定Java版本 |
@ConditionalOnJndi | JNDI存在指定项 |
@ConditionalOnMissingBean | 容器中不存在指定Bean |
@ConditionalOnMissingClass | 容器中不存在指定Class |
@ConditionalOnNotWebApplication | 当前不是Web环境 |
@ConditionalOnProperty | 满足指定属性 |
@ConditionalOnResource | 类路径下存在指定资源文件 |
@ConditionalOnSingleCandidate | 容器中只有一个指定的Bean |
@ConditionalOnWarDeployment | 应用War文件部署 |
@ConditionalOnWebApplication | 当前是Web环境 |
6、内置容器启动原理
核心处理逻辑在ApplicationContext.onRefresh()
方法中,此方法允许在特定上下文子类中创建内置容器,根据应用类型来确定具体是Servlet应用上下文还是Reactive应用上下文,具体代码逻辑在ServletWebServerApplicationContext.java和ReactiveWebServerApplicationContext.java
文件中
6.2、创建Web服务器
6.2、启动Web服务器
在上一步Web服务器创建完成后,将WebServerStartStopLifecycle作为单例Bean注册至Spring容器,并在ApplicationContenxt.finishRefresh()完成刷新之后,由DefaultLifecycleProcessor默认生命周期处理器触发执行WebServerStartStopLifecycle.start()方法,在此start方法中启动Web服务器