SpringBoot源码解析

本文介绍了SpringBoot框架,强调其简化配置、提高开发效率的特点,特别是在微服务架构中的应用。内容涵盖了SpringBoot与SpringCloud的区别,自动装配原理,以及内置容器启动流程。
摘要由CSDN通过智能技术生成

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服务器

7、附录

Spring Boot Reference Documentation

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值