关于Spring boot启动过程判断当前是否Web环境

本文介绍了SpringBoot中SpringApplication初始化过程中的关键步骤之一:如何通过检查特定类的存在与否来判断应用是否处于Web环境中。

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

    SpringBoot 的SpringApplication在初始化过程中执行initialize方法:

@SuppressWarnings({ "unchecked", "rawtypes" })
	private void initialize(Object[] sources) {
		if (sources != null && sources.length > 0) {
			this.sources.addAll(Arrays.asList(sources));
		}
		this.webEnvironment = deduceWebEnvironment();
		setInitializers((Collection) getSpringFactoriesInstances(
				ApplicationContextInitializer.class));
		setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
		this.mainApplicationClass = deduceMainApplicationClass();
	}

其中这段代码 this.webEnvironment = deduceWebEnvironment(); 的功能是判断当前运行环境是否Web环境,详细代码是:

private static final String[] WEB_ENVIRONMENT_CLASSES = { "javax.servlet.Servlet",
			"org.springframework.web.context.ConfigurableWebApplicationContext" };

private boolean deduceWebEnvironment() {
		for (String className : WEB_ENVIRONMENT_CLASSES) {
			if (!ClassUtils.isPresent(className, null)) {
				return false;
			}
		}
		return true;
}

通过枚举WEB_ENVIRONMENT_CLASSES常量,判断Web环境下主要的类是否能够加载成功(是否当前正在运行的类),有任何一个类无法加载成功都将返回false

### Spring Boot 核心启动流程解析 Spring Boot 的核心启动流程可以分为几个关键阶段,这些阶段共同协作完成应用程序的初始化和运行。以下是详细的分析: #### 1. SpringApplication 类实例化 `SpringApplication` 是整个 Spring Boot 应用程序启动的核心入口点。当创建 `SpringApplication` 实例时,会执行一系列操作来准备环境并设置默认参数[^2]。 ```java public static void main(String[] args) { SpringApplication app = new SpringApplication(DemoApplication.class); app.run(args); } ``` 在此过程中,`SpringApplication` 构造函数会扫描传入的应用程序类及其父类路径下的特定注解(如 `@SpringBootApplication`),并将它们作为配置元数据的一部分存储起来[^1]。 --- #### 2. 初始化监听器与事件发布机制 在调用 `run()` 方法之前,`SpringApplication` 会注册一组内置的 `SpringApplicationRunListener`,用于监控启动过程中的各个生命周期事件。默认情况下,使用的实现是 `EventPublishingRunListener`,它能够捕获并广播不同阶段发生的事件[^4]。 例如,在启动初期触发的典型事件有: - **ApplicationStartingEvent**: 表明应用即将开始启动。 - **ApplicationEnvironmentPreparedEvent**: 当环境变量准备好后发出的通知。 --- #### 3. 配置文件加载与上下文构建 通过 `SpringBootConfigurationLoader` 加载所有的外部配置属性以及内部默认值,并将其注入到 `ConfigurableEnvironment` 对象中[^1]。此步骤确保了所有必要的全局设置都可以动态调整而无需硬编码。 接着,根据所选模式(Web 或非 Web)决定采用哪种类型的 IoC 容器——即标准 Java SE 环境下使用的是 `AnnotationConfigApplicationContext`;而在 Servlet API 支持场景里,则切换至更高级别的 `ServletWebServerApplicationContext`[^3]。 --- #### 4. 自动装配与 Bean 注册 这是 Spring Boot 最具特色的部分之一。“自动装配”意味着框架可以根据项目依赖关系自行推断哪些组件应该被激活或禁用。这一特性极大地减少了手动编写 XML 文件或者繁杂的 Java Config 所需的时间成本。 具体来说,借助于条件判断逻辑(Condition Evaluation Rules),只有满足某些前提条件下才会实际引入对应的模块和服务提供者[^3]。比如如果检测到了 Hibernate JPA 存在于 classpath 上,则相应地绑定事务管理器等功能也会随之生效。 --- #### 5. 启动完成后回调钩子 一旦全部准备工作结束并且服务器已经成功部署完毕之后,最后一步便是通知其他可能感兴趣的参与者关于当前状态的变化情况。这通常涉及以下几个方面: - 发布最终的成功消息给订阅方; - 调度定时任务或其他后台作业线程池资源分配工作等等。 --- ### 总结 综上所述,从最基础层面看去,Spring Boot启动流程大致遵循这样一个顺序链路:先由主方法驱动进入点 -> 创建容器实例 -> 设置好基本选项后再逐步填充具体内容直至完全成型为止。每一个环节都紧密相连互不可缺省掉任何一个都会影响整体效果呈现出来的好坏程度如何取决于前期规划是否合理充分考虑周全各种边界状况处理得当与否等因素综合评估得出结论。 ```java @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); // 整体控制流由此展开 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值