首页 > 其他分享 >Spring的启动流程

Spring的启动流程

时间:2024-09-20 16:51:23浏览次数:9  
标签:初始化 容器 Spring 流程 启动 +-------------------+ Bean

Spring容器的启动流程是一个复杂的过程,涉及多个阶段和组件的协作。核心是ApplicationContext(如ClassPathXmlApplicationContextAnnotationConfigApplicationContext等)接口的启动。通过对Spring启动流程的详细分析,可以更好地理解Spring是如何加载、解析、实例化、初始化并管理Bean的。

下面将详细描述Spring容器的启动流程,具体步骤如下:

1. 启动Spring容器

  • Spring容器启动的第一步是创建ApplicationContext对象。ApplicationContext是Spring容器的核心接口,代表了Spring上下文环境。常见的实现类有:
    • ClassPathXmlApplicationContext: 从类路径下的XML配置文件中加载Bean定义。
    • AnnotationConfigApplicationContext: 基于注解配置启动容器。
    • FileSystemXmlApplicationContext: 从文件系统中的XML配置文件中加载Bean定义。

2. 读取和解析配置文件

  • Spring需要根据配置(XML文件、注解配置类等)加载Bean定义。Spring的BeanDefinitionReader负责解析这些配置。
    • 如果使用XML配置文件,XmlBeanDefinitionReader负责读取和解析配置文件,并将解析得到的Bean定义信息转换为BeanDefinition对象。
    • 如果使用注解配置类,AnnotatedBeanDefinitionReader负责扫描和解析注解,并注册Bean。

3. BeanDefinition的注册

  • 解析Bean定义后,Spring会将每个Bean的定义信息以BeanDefinition形式注册到BeanFactory中。BeanDefinition包含了Bean的各种元数据,比如Bean的类类型、作用域(单例/原型)、是否需要懒加载、依赖关系等。
  • 通过DefaultListableBeanFactory来管理和存储这些BeanDefinition

4. Spring容器刷新(refresh())

  • 这是Spring启动过程中最核心的步骤。ApplicationContextrefresh()方法会完成一系列操作,启动和初始化Spring容器:
    1. 准备上下文环境

      • 设置上下文环境,包括配置资源(例如属性文件的读取),初始化一些特定的环境变量。
    2. 初始化BeanFactory

      • 创建或刷新BeanFactory,即完成对所有BeanDefinition的解析和注册,形成一个完整的Bean定义列表。
    3. BeanFactory的后处理

      • 如果有BeanFactoryPostProcessor(比如PropertyPlaceholderConfigurer),Spring会在这个阶段执行它们的回调,修改BeanDefinition的定义或者其他元数据。
    4. 注册Bean后处理器(BeanPostProcessor)

      • 注册所有实现BeanPostProcessor接口的类。这些处理器允许在Bean初始化前后进行拦截处理(如AOP代理、依赖注入后的处理等)。
    5. 实例化和初始化单例Bean

      • 对所有非懒加载的单例Bean进行实例化和初始化。这里涉及到Bean的生命周期方法的调用,包括依赖注入、初始化方法的调用。

      • 初始化时会依次执行以下几个步骤:

        • 调用Bean的构造方法实例化。
        • 通过set方法注入依赖。
        • 如果Bean实现了BeanNameAwareBeanFactoryAware等接口,会调用相应的方法。
        • 如果有BeanPostProcessor,会在Bean初始化前后进行拦截处理。
        • 执行Bean的初始化方法(如@PostConstruct或自定义的init-method)。
    6. 初始化事件广播器(ApplicationEventMulticaster)

      • 创建并初始化事件广播器,用于处理应用事件,如ContextRefreshedEvent等。
    7. 注册事件监听器

      • 注册应用程序中的事件监听器(如果有ApplicationListener),使得它们能够监听Spring容器发布的事件。
    8. 完成容器的初始化

      • 发布ContextRefreshedEvent,通知所有监听器Spring容器已经完全启动。

5. 获取Bean

  • 当容器启动并完成初始化后,用户可以通过ApplicationContext.getBean()方法获取Bean的实例,使用已经准备好的Bean来处理业务逻辑。

6. 销毁与关闭容器

  • 当应用程序结束或者容器关闭时,Spring会调用所有单例Bean的销毁方法,通常通过close()destroy()来关闭容器。
  • 销毁过程包括:
    • 调用所有实现了DisposableBean接口的Bean的destroy()方法。
    • 如果配置了自定义的销毁方法(如destroy-method),也会被执行。
    • 发布ContextClosedEvent,通知监听器容器已经关闭。

Spring启动流程总结图:

+-------------------+
|  启动ApplicationContext |
+-------------------+
           ↓
+-------------------+
|   读取和解析配置文件  |
+-------------------+
           ↓
+-------------------+
| 注册BeanDefinition |
+-------------------+
           ↓
+-------------------+
|     容器刷新(refresh)    |
+-------------------+
           ↓
| - 初始化环境变量         |
| - 初始化BeanFactory      |
| - 执行BeanFactoryPostProcessor |
| - 注册BeanPostProcessor  |
| - 实例化和初始化单例Bean  |
| - 事件监听器注册         |
| - 发布ContextRefreshedEvent |
+-------------------+
           ↓
+-------------------+
|     获取Bean并使用    |
+-------------------+
           ↓
+-------------------+
|      容器销毁与关闭    |
+-------------------+

主要方法:

  • refresh():Spring容器的核心方法,负责完成Bean的创建、初始化、后处理等工作。
  • getBean():从Spring容器中获取Bean实例的主要接口。
  • close():关闭Spring容器,销毁Bean并清理资源。

总结:

Spring的启动流程围绕着容器的初始化和Bean的创建展开,通过读取配置文件、注册Bean定义、调用生命周期回调方法(如BeanPostProcessorBeanFactoryPostProcessor)、初始化Bean及事件驱动等多个步骤,最终构建出一个完整的应用上下文。

标签:初始化,容器,Spring,流程,启动,+-------------------+,Bean
From: https://www.cnblogs.com/juyss/p/18422812

相关文章

  • oracle常用后台进程及sql语句执行流程
    1.checkpoint功能:减少崩溃恢复crashrecovery时间。检查点可以确保在某个时间点之前的所有事务都写入磁盘,保证数据一致性后台进程ckpt触发,ckpt通知dbwr进程将脏数据库dirtybuffer写出到数据文件上.更新数据文件头及控制文件上的检查点触发条件:数据库一致性关闭、altersystem......
  • SMT丨工艺特点及详细生产工艺流程
    SMT丨工艺特点及详细生产工艺流程表面组装技术SMT现状SMT是目前电子组装行业里最流行的一种技术和工艺。自70年代初推向市场以来,SMT已逐渐替代传统"人工插件"的波峰焊组装方式,已成为现代电子组装产业的主流,人们称为电子组装技术的第二次革命。在国际上,这种组装技术已经形成了世......
  • 从数据中台到数据飞轮:一轮启动数据驱动未来
    在数字化时代,数据中台已经成为企业整合、处理和分析数据的基石,它的实施对于构建数据驱动的业务生态具有重要意义。然而,仅仅构建数据中台并不足以推动企业走向数据驱动的高峰。这是因为,数据中台虽然集中了数据资源,提高了数据的可访问性,但若缺乏高效的利用机制和数据应用的闭环驱动,企......
  • redis主从配置启动(1主2从)
    一、安装redis略二、主节点配置文件daemonizeyespidfile/usr/local/redis/logs/redis_6379.pidport6379tcp-backlog1024bind0.0.0.0timeout0tcp-keepalive60loglevelnoticelogfile"/usr/local/redis/logs/redis_6379.log"databases16save""sav......
  • Spring框架bean的生命周期
    在Spring框架中,Bean的生命周期是指一个Spring容器中Bean从创建到销毁的整个过程。Spring容器负责管理Bean的生命周期,它通过依赖注入和面向切面的编程(AOP)为开发者简化了许多繁琐的操作。Spring框架提供了许多钩子方法,允许开发者在特定阶段执行自定义的逻辑。Bean的生命周期大致可......
  • 基于Node.js+vue基于springboot和vue的音乐网站(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,数字音乐已成为人们日常生活中不可或缺的一部分。音乐网站作为数字音乐传播的重要平台,不仅为用户提供了丰富的音乐资源,还通过多样......
  • flink 启动Job加载外部jar都有哪些方法?
    flink启动Job加载外部jar都有哪些方法在ApacheFlink版本中,启动Job时加载外部Jar包有几种不同的方法。这些方法允许用户引入自定义的UDF(用户定义函数)或其他依赖项。以下是几种常见的方法:1.使用flinkrun命令直接启动你可以通过命令行工具flinkrun来指定你的Job......
  • 只有一个方法被aop另外的方法没有aop那么spring会怎么生成代理对象并执行方法
    在Spring中,使用AOP(面向切面编程)时,Spring框架会基于你的配置或注解来决定哪些方法需要被增强(即应用额外的行为,如日志记录、事务管理等)。当只有部分方法被指定为需要AOP处理时,Spring会根据这些配置动态地生成代理对象,并确保只有那些被标记为需要增强的方法在执行时会通过代理逻辑。......
  • 基于Node.js+vue基于SpringBoot的民间遗产中心(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景在全球化与文化多样性的背景下,民间遗产作为民族文化的重要组成部分,承载着丰富的历史记忆与地域特色,是连接过去与未来的重要纽带。然而,随着现代化进程的加速,......
  • 基于Node.js+vue基于SpringBoot的毕业生就业系统(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着高等教育的普及,每年有大量毕业生涌入就业市场,而企业与求职者之间的信息不对称问题日益凸显。传统的招聘方式效率低下,难以满足毕业生快速找到合适岗位及......