【Spring Cloud专题一】Spring Cloud基础--Spring Boot

SpringBoot为了解决基于Spring的Servlet开发繁琐问题而诞生,它提供了内置Servlet容器、统一的配置格式和自动化装配功能。核心包括WebServer、条件注解和工厂加载机制,条件注解确保了配置类在特定条件下生效,工厂加载机制简化了应用启动和管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Spring Boot 诞生背景

1.1 servlet开发问题(2012年 mike youngstrom【AWS工程师】在spring jira提出)

基于spring原生的Servlet开发太繁琐,需要额外的学习成本,问题如下:
- 需要配置文件如web.xml,不同的Servlet容器的配置文件也不同。
- 需要构建war包部署到Servlet容器。
- 不同的Servlet容器有不同的配置方式,比如端口和线程池。
- ClassLoader 继承机制复杂。
- 监控和管理功能需要在应用外部进行配置。
- 单独配置日志功能。
- 理解ApplicationContext内的各种配置以及继承关系。

1.2 起源想法

Improve Containerless Web Application Architectures(改进无容器的 Web 应用结构)
- 提供一个统一的组件模型,不需要知道Servlet组件模型。
- 统一所有的配置格式,生效于应用和第三方组件,只需要学习这个配置模型。
- 从main函数执行将会简化应用的启动和关闭。
- 一个更简单的纯java类加载层次结构。
- 简单的开发工具(不需要复杂的IDE来构建WAR包,也不用部署到Servlet容器)。

1.3 如今的SpringBoot对应的功能

Spring Boot创始人Phil Webb针对上面的问题以及一些其他关联Issure,决定启动Spring Boot新项目,而不是在Spring Core 模块里修改。
- 内置Servlet容器,提供统一的容器抽象【如Tomcat、Jetty、Undertow和Netty实现类】。
- 对所有的组件的配置项,可以使用相同的格式在application.properties或application.yml中配置。
- 提供了SpringApplication用于直接运行Spring应用,无须关注ApplicationContext的构造。
- 只存在一个ClassLoader,不会像单独的Servlet容器那样拥有独立的ClassLoader。
- 内置Servlet容器,直接执行main方法即可,无须构造WAR包

提示:以上内容可以参见Spring Boot官网概览【overview】中的历史,重点关注其中的特性【Features】。


2. Spring Boot 核心

提示:个人理解SpringBoot的核心就是其核心特性能力产生的根本原因

2.1 WebServer

新版本的SpringBoot使用WebServer来取代原来的内置Servlet容器【EmbeddedWebApplicationContext】,具体工厂类类图如下:
两种WebServer工厂类图

两种WebServer类图

2.2 条件注解

Spring Boot的自动化装配模块 spring-boot-autoconfigure中包含很多第三方依赖的AutoConfiguration自动化装配类。
为了保证这些AutoConfiguration只在特定场景下生效,我们有了条件注解。

条件注解作用条件注解解析类
@ConditionalOnBeanApplicationContext存在某些Bean时,条件成立OnBeanCondition
@ConditionalOnMissingBeanApplicationContext不存在某些bean时,条件成立OnBeanCondition
@ConditionalOnSingleCandidateApplicationContext中存在且只有一个bean时条件成立OnBeanCondition
@ConditionalOnClassClassPath中存在某些Class时,条件成立OnClassCondition
@ConditionalOnMissingClassclassPath中不存在某些Class时,条件成立OnClassCondition
@ConditionalOnCloudPlatform在某些云平台(Kubemetes、Heroku、Cloud Foundry)下条件成立OnCloudPlatformCondition
@ConditionalOnExpressionSPEL表达式(spring的el表达式)成立时条件才成立OnExpressionCondition
@ConditionalOnJavaJDK某些版本条件成立,默认Range范围 >= JDK的某个版本OnJavaCondition
@ConditionalOnJndiJNDI路径下存在时条件才成立OnJndiCondition
@ConditionalOnWebApplication在Web环境下条件才成立OnWebApplicationCondition
@ConditionalOnNotWebApplication在非Web环境下条件才成立OnWebApplicationCondition
@ConditionalOnPropertyEnvironment中存在某些配置项时才成立OnPropertyCondition
@ConditionalOnResource存在某些资源时条件才成立OnResourceCondition

提示:条件注解仅仅是一个注解,真正的判断逻辑在这些条件注解的解析类内部。

Spring Boot通过spring-context模块中的ConditionEvaluator来使用条件注解去判断是否需要加载自动化配置类。
在AnnotatedBeanDefinitionReader、ClassPathScanningCandidateComponentProvider、ConfigurationClassBeanDefinitionReader、ConfigurationClassParser中使用ConditionEvaluator去判断是否跳过相关配置类。
条件注解生效示例图

提示:Condition的子类SpringBootCondition使用模板方法模式,转matches到getMatchOutcome方法。@ConditionalOnBean之类的注解源码引用@Conditional(OnBeanCondition.class)注解。
自定义条件注解的关键就是继承Condition【Spring】或SpringBootCondition【Spring Boot】,实现matches或getMatchOutcome方法

2.3 工厂加载机制

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值