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的启动等。

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

目录
相关文章
|
6天前
|
消息中间件 缓存 Java
手写模拟Spring Boot启动过程功能
【11月更文挑战第19天】Spring Boot自推出以来,因其简化了Spring应用的初始搭建和开发过程,迅速成为Java企业级应用开发的首选框架之一。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,帮助读者深入理解其工作机制。
21 3
|
1月前
|
Cloud Native Java C++
Springboot3新特性:开发第一个 GraalVM 本机应用程序(完整教程)
文章介绍如何在Spring Boot 3中利用GraalVM将Java应用程序编译成独立的本机二进制文件,从而提高启动速度、减少内存占用,并实现不依赖JVM运行。
195 1
Springboot3新特性:开发第一个 GraalVM 本机应用程序(完整教程)
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
145 1
|
1月前
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
|
20天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
95 62
|
17天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
35 2
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用
【10月更文挑战第8天】本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,通过 Spring Initializr 创建并配置 Spring Boot 项目,实现后端 API 和安全配置。接着,使用 Ant Design Pro Vue 脚手架创建前端项目,配置动态路由和菜单,并创建相应的页面组件。最后,通过具体实践心得,分享了版本兼容性、安全性、性能调优等注意事项,帮助读者快速搭建高效且易维护的应用框架。
41 3
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用
【10月更文挑战第7天】本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,通过 Spring Initializr 创建 Spring Boot 项目并配置 Spring Security。接着,实现后端 API 以提供菜单数据。在前端部分,使用 Ant Design Pro Vue 脚手架创建项目,并配置动态路由和菜单。最后,启动前后端服务,实现高效、美观且功能强大的应用框架。
42 2
|
1月前
|
Java BI API
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
这篇文章介绍了如何在Spring Boot项目中整合iTextPDF库来导出PDF文件,包括写入大文本和HTML代码,并分析了几种常用的Java PDF导出工具。
416 0
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
|
1月前
|
搜索推荐 Java UED
SpringBoot 自定义启动画面:打造个性化应用启动体验
【10月更文挑战第7天】在软件开发中,细节往往能够体现一个团队的专业性和对用户体验的关注。SpringBoot作为快速构建Spring应用的框架,其简洁的启动流程和强大的功能深受开发者喜爱。然而,默认的启动画面可能略显单调,无法充分展示应用的特色或品牌。本文将详细介绍如何为SpringBoot应用自定义启动画面,让应用在启动时就能给人留下深刻印象。
52 1