SpringBoot(一):springboot应用程序启动过程核心分析

简介: 说起**springboot**大家很容易想到的就是**自动装配**、**约定大于配置**这个特点,的确这是springboot相比较于普通的**spring** web项目最大的亮点。

SpringBoot(一):springboot应用程序启动过程核心分析

说起springboot大家很容易想到的就是自动装配约定大于配置这个特点,的确这是springboot相比较于普通的spring web项目最大的亮点。

从根本上来说,springboot的核心还是基于spring上下文ApplicationContext继承延伸自己的个性化能力,
以及依靠spring的开放扩展点(如ApplicationContextInitializer、BeanFactoryPostProcessor等)来实现自己的自动装配等功能,
从而我们可以轻松的构建spring web项目,让我们把更多的时间精力花费到实际业务开发上。

具体spring的扩展点大概有13个,以下是我通过代码demo演示,需要了解的可以去Git自己获取,这里不再细说

// Git代码
https://gitee.com/yeeevip/yeee-memo/tree/master/learn-example/spring-boot-example/src/main/java/vip/yeee/memo/demo/springboot/extpoint
https://github.com/yeeevip/yeee-memo/tree/master/learn-example/spring-boot-example/src/main/java/vip/yeee/memo/demo/springboot/extpoint

接下来我们要开始肝本文干货内容了:通过springboot程序启动过程核心分析,了解怎么自动装配Bean?怎么自动启动的web服务器?

1 核心类

1.1 SpringApplication

我们平时一般从Java的main方法中使用SpringApplication去引导和启动Spring应用程序。

@SpringBootApplication
public class SpringbootExampleApplication {
   

    public static void main(String[] args) {
   
        SpringApplication.run(SpringbootExampleApplication.class, args);
    }
}

默认情况下,该类将执行以下步骤来引导你的应用程序:

1. 创建适当的ApplicationContext上下文实例(取决于你的类路径下依赖的web容器类型)

2. 初始化程序上下文,加载classpath下所有定义的Bean、注册一些内部的Bean(如用注解配置类后置处理器)等

3. 刷新应用程序上下文,执行注解配置类后置处理器、启动web服务器(如tomcat,取决于具体依赖)、完成所有单例Bean的实例化、属性注入、初始化等

4. 上下文刷新完成程序启动后,可以执行afterRefresh()逻辑以及触发任何XXXRunner bean,如CommandLineRunner、ApplicationRunner

@SpringBootApplication.@EnableAutoConfiguration.@Import(AutoConfigurationImportSelector.class)

这个是springboot自身SPI机制可以按需导入starter配置Bean,其实现时通过spring.factories中指定自动配置的全限定配置类

以下是一些自定义starter的demo,有兴趣的同学可以看看怎么实现的:

// Git代码
https://gitee.com/yeeevip/yeee-memo/tree/master/memo-parent/memo-common
https://github.com/yeeevip/yeee-memo/tree/master/memo-parent/memo-common

1.2 AnnotationConfigServletWebServerApplicationContext

这个继承自ServletWebServerApplicationContext,拥有了创建/初始化/运行Web服务器的能力;同时其SuperClass本身也是实现了BeanDefinitionRegistry,
可以提前注册一些内置的PostProcessor用来辅助加载注解定义从而自动装配

ServletWebServerApplicationContext

该类主要实现了通过ServletWebServerFactory创建、启动WebServer的逻辑,ServletWebServerFactory具体实例取决于你引入的是tomcat-starter还是其他的

看源码可以发现这个类重写了AbstractApplicationContext的onRefresh()方法进行了WebServer的启动,也就是说WebServer的启动时机在进行单例bean初始化之前

1.3 注册处理注解的XXXPostProcessor类

为了达到自动装配的目标,springboot上下文ApplicationContext创建后,在初始化上下文时会注册多个用于注解处理的后置处理器,读取注解标记的Bean注册到spring容器

ConfigurationClassPostProcessor

BeanFactory级别的后置处理器,继承至BeanFactoryPostProcessor,专门用于处理@Configuration标识的配置类,
具体实现由ConfigurationClassParser加载由@PropertySource、@ComponentScan、@Import、@Bean标识的方法、类将这些Bean注册到spring容器

AutowiredAnnotationBeanPostProcessor

继承至BeanPostProcessor,Bean级别的后置处理器,用于将@Autowired、@Inject、@Value标识的字段、方法进行属性注入

CommonAnnotationBeanPostProcessor

继承至BeanPostProcessor,处理非spring的注解,@Resource、@PostConstruct、@PreDestroy,用于属性注入、实例化后/销毁前执行回调方法等

2. 总结

今天通过分析springboot的这几个核心类、注解可以发现:

首先,springboot有自己的独有注解,如@EnableAutoConfiguration、@Import来实现SPI机制,从而达到按需引入/自动配置、可扩展性的特点,
其次springboot的自身创建的应用上下文AnnotationConfigServletWebServerApplicationContext是在spring基础上下文的功能上扩展了自身的能力,如注解配置的扫描、WebServer的启动等。

由于篇幅的原因本次的分享就到这里了,接下来的文章我会继续深入的进行分析。

目录
相关文章
|
10天前
|
安全 NoSQL Java
SpringBoot接口安全:限流、重放攻击、签名机制分析
本文介绍如何在Spring Boot中实现API安全机制,涵盖签名验证、防重放攻击和限流三大核心。通过自定义注解与拦截器,结合Redis,构建轻量级、可扩展的安全防护方案,适用于B2B接口与系统集成。
147 3
|
2月前
|
JavaScript Java 应用服务中间件
基于springboot的学生成绩分析和弱项辅助系统
本系统旨在解决学生成绩分析与弱项辅助信息管理效率低下的问题,通过软件技术实现数据处理的高效化、流程化与规范化,提升管理质量与便捷性。
|
3月前
|
XML 人工智能 IDE
Springboot整合SSMP报错分析
本文介绍了Springboot整合SSMP框架时常见的报错及解决方案,包括MyBatis-Plus版本不兼容导致的Lambda表达式条件构造器报错及表名不匹配问题。通过升级或降级MyBatis-Plus版本、使用@TableName注解或配置table-prefix属性,可有效解决上述问题,帮助开发者避免在整合SSMP时出现不必要的错误。
179 0
|
4月前
|
SQL Java 数据库
解决Java Spring Boot应用中MyBatis-Plus查询问题的策略。
保持技能更新是侦探的重要素质。定期回顾最佳实践和新技术。比如,定期查看MyBatis-Plus的更新和社区的最佳做法,这样才能不断提升查询效率和性能。
167 1
|
5月前
|
安全 Java API
Spring Boot 功能模块全解析:构建现代Java应用的技术图谱
Spring Boot不是一个单一的工具,而是一个由众多功能模块组成的生态系统。这些模块可以根据应用需求灵活组合,构建从简单的REST API到复杂的微服务系统,再到现代的AI驱动应用。
|
11月前
|
Java 应用服务中间件 Maven
如何将 Spring Boot 应用程序部署为 WAR?
如何将 Spring Boot 应用程序部署为 WAR?
556 1
|
6月前
|
SQL 前端开发 Java
深入分析 Spring Boot 项目开发中的常见问题与解决方案
本文深入分析了Spring Boot项目开发中的常见问题与解决方案,涵盖视图路径冲突(Circular View Path)、ECharts图表数据异常及SQL唯一约束冲突等典型场景。通过实际案例剖析问题成因,并提供具体解决方法,如优化视图解析器配置、改进数据查询逻辑以及合理使用外键约束。同时复习了Spring MVC视图解析原理与数据库完整性知识,强调细节处理和数据验证的重要性,为开发者提供实用参考。
256 0
|
10月前
|
Java 数据库连接 Maven
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
自动装配是现在面试中常考的一道面试题。本文基于最新的 SpringBoot 3.3.3 版本的源码来分析自动装配的原理,并在文未说明了SpringBoot2和SpringBoot3的自动装配源码中区别,以及面试回答的拿分核心话术。
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
|
9月前
|
Java 应用服务中间件 API
【潜意识Java】javaee中的SpringBoot在Java 开发中的应用与详细分析
本文介绍了 Spring Boot 的核心概念和使用场景,并通过一个实战项目演示了如何构建一个简单的 RESTful API。
173 5
|
10月前
|
消息中间件 监控 Java
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
150 6