简析SpringBoot启动执行流程

简介: 简析一下SpringBoot的启动流程

SpringBoot已经成为Spring的主流框架了,经典的自动配置大大解放了开发的双手,今天就来简析一下SpringBoot的启动流程:

话不多说,直接撸铁:正常我们的SpringBoot启动类:

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

启动类的关键在于 @SpringBootApplication 这个注解,那我们就进去看下这个注解:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
   ......
}

从代码片段中可以看出,@SpringBootApplication 是一个复合型注解的接口,有一些默认接口方法,我们只关心三个注解,分别是:

  • @SpringBootConfiguration
  • @EnableAutoConfiguration
  • @ComponentScan

①. @SpringBootConfiguration :

@SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类;JavaConfig形式的IOC配置类。

②. @EnableAutoConfiguration:

作用简而言之就是将符合条件的@Configuration加载到IOC容器中去,这个注解的幕后使者是SpringFactoriesLoader,这个类的功能是:从META-INF/Spring.factories加载配置

③.@ComponentScan:

自动扫描,ComponentScan做的事情就是告诉Spring从哪里找到bean;

例:@ComponentScan({"com.in28minutes.package1","com.in28minutes.package2"})
@Configuration
public class SpringConfiguration {
相比于xml:
<context:component-scan base-package="com.in28minutes.package1, com.in28minutes.package2" />

SpringApplication.run()的启动执行流程:

1. 实例化对象SpringApplication
2. 初始化对象,方法开始执行——>SpringFactoriesLoader加载——>SpringApplicationRunListener监听main方法的每个执行节点——>started()方法
3. 配置Enviroment(PropertySource及profile)
4. 创建ApplicationContext(ApplicationContext是Spring框架中一个很重要的接口,它扩展了BeanFactory,SpringBoot启动过程中,SpringApplication通常会选择合适的ApplicationContext实现类)
5. 遍历所有的SpringApplicationRunListener的contextPrepared()方法,通知ApplicationContext准备好了,可以进行下一步了
6. ★ 核心:将配置的@EnableAutoConfiguration获取所有配置及自定义的IOC,加载到准备完毕的ApplicationContext中去
7. ApplicationContext装填完毕后,调用refresh()方法,完成IOC的最后一道工序
8. 遍历执行SpringApplicationRunListener的finished()方法,到此SpringBoot启动完成。


相关文章
|
15天前
|
前端开发 Java 应用服务中间件
SpringBoot-Run启动流程
探索Spring Boot启动流程,从加载配置、创建应用上下文、自动配置到启动内嵌服务器。启动类是入口点,`@SpringBootApplication`标记启动,`SpringApplication.run`启动应用。自动配置基于条件注解配置Bean,应用上下文由`SpringApplication`创建并刷新。内嵌服务器如Tomcat随应用启动,简化部署。理解此流程有助于深入掌握Spring Boot。
159 2
|
2月前
|
缓存 Java 程序员
springboot的启动流程总结
springboot的启动流程总结
|
2月前
|
设计模式 Java 容器
SpringBoot2 | SpringBoot启动流程源码分析(二)
SpringBoot2 | SpringBoot启动流程源码分析(二)
44 0
|
3月前
|
设计模式 Java 机器人
SpringBoot3自动配置流程 SPI机制 核心注解 自定义starter
SpringBoot3自动配置流程 SPI机制 核心注解 自定义starter
|
6月前
|
数据可视化 前端开发 Java
SpringBoot 集成 Flowable + Flowable Modeler 流程配置可视化(图解)(一)
SpringBoot 集成 Flowable + Flowable Modeler 流程配置可视化(图解)
307 0
|
4月前
|
安全 NoSQL Java
SpringBoot集成Activiti5.22在线流程设计器
SpringBoot集成Activiti5.22在线流程设计器
47 0
SpringBoot集成Activiti5.22在线流程设计器
|
2月前
|
缓存 Java uml
SpringBoot2 | Spring IOC 流程中核心扩展接口的12个扩展点源码分析(十一)
SpringBoot2 | Spring IOC 流程中核心扩展接口的12个扩展点源码分析(十一)
37 0
|
2月前
|
Java 容器 Spring
SpringBoot2 | @SpringBootApplication注解 自动化配置流程源码分析(三)
SpringBoot2 | @SpringBootApplication注解 自动化配置流程源码分析(三)
33 0
|
2月前
|
Java 中间件 容器
SpringBoot2 | SpringBoot启动流程源码分析(一)
SpringBoot2 | SpringBoot启动流程源码分析(一)
45 0
|
7月前
|
Java 容器 Spring
springboot启动流程原理
springboot启动流程原理
100 0