Spring的启动流程

Spring的启动流程

Spring容器的启动流程是一个复杂的过程,涉及多个阶段和组件的协作。核心是ApplicationContext(如ClassPathXmlApplicationContext、AnnotationConfigApplicationContext等)接口的启动。通过对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启动过程中最核心的步骤。ApplicationContext的refresh()方法会完成一系列操作,启动和初始化Spring容器:

准备上下文环境:

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

初始化BeanFactory:

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

BeanFactory的后处理:

如果有BeanFactoryPostProcessor(比如PropertyPlaceholderConfigurer),Spring会在这个阶段执行它们的回调,修改BeanDefinition的定义或者其他元数据。

注册Bean后处理器(BeanPostProcessor):

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

实例化和初始化单例Bean:

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

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

调用Bean的构造方法实例化。

通过set方法注入依赖。

如果Bean实现了BeanNameAware、BeanFactoryAware等接口,会调用相应的方法。

如果有BeanPostProcessor,会在Bean初始化前后进行拦截处理。

执行Bean的初始化方法(如@PostConstruct或自定义的init-method)。

初始化事件广播器(ApplicationEventMulticaster):

创建并初始化事件广播器,用于处理应用事件,如ContextRefreshedEvent等。

注册事件监听器:

注册应用程序中的事件监听器(如果有ApplicationListener),使得它们能够监听Spring容器发布的事件。

完成容器的初始化:

发布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定义、调用生命周期回调方法(如BeanPostProcessor和BeanFactoryPostProcessor)、初始化Bean及事件驱动等多个步骤,最终构建出一个完整的应用上下文。

相关推荐

钟齐鑫勇夺壁虎王2015世界杯攀岩赛男子速度冠军
365bet亚洲版官方

钟齐鑫勇夺壁虎王2015世界杯攀岩赛男子速度冠军

📅 07-03 👁️ 7310
五件事让网友越来越讨厌邓超, 黑历史遭起底
365彩票所有官方app下载平台

五件事让网友越来越讨厌邓超, 黑历史遭起底

📅 07-06 👁️ 7450
老板打人有赔偿吗北京律师
365bet平台开户

老板打人有赔偿吗北京律师

📅 08-23 👁️ 672