Spring
Spring 框架的启动过程涉及到多个模块和组件,以下是 Spring 框架的主要启动流程:
-
加载配置文件:
- Spring 框架通常会通过 XML 配置文件或注解方式进行配置。在启动过程中,Spring 首先加载这些配置文件,解析配置信息,构建应用上下文。
-
创建应用上下文(ApplicationContext):
- Spring 启动后,会创建一个应用上下文对象,该对象是 Spring 框架的核心容器,负责管理和维护 Bean 对象、处理事件、执行 AOP 等操作。
-
扫描并注册 Bean 定义:
- Spring 会扫描指定包路径下的类,识别带有
@Component
、@Service
、@Repository
、@Controller
等注解的类,并注册这些类的 Bean 定义。
- Spring 会扫描指定包路径下的类,识别带有
-
实例化和依赖注入:
- Spring 容器会实例化被注册的 Bean,并进行依赖注入。这包括通过构造函数、Setter 方法或字段注入方式将相关 Bean 注入到目标 Bean 中。
-
执行生命周期回调:
- Spring 通过回调机制执行 Bean 的初始化和销毁方法。这包括
@PostConstruct
和@PreDestroy
注解、InitializingBean
和DisposableBean
接口等。
- Spring 通过回调机制执行 Bean 的初始化和销毁方法。这包括
-
触发事件通知:
- Spring 框架支持事件驱动模型,容器会触发各种事件通知,开发者可以通过监听器(
ApplicationListener
)来处理这些事件,如上下文初始化完成事件、上下文关闭事件等。
- Spring 框架支持事件驱动模型,容器会触发各种事件通知,开发者可以通过监听器(
-
启动 Spring 容器:
- 容器启动后,开始正式提供服务。应用程序可以通过从容器中获取 Bean 对象来调用业务逻辑。
-
处理 AOP:
- 如果使用了 AOP(面向切面编程),Spring 会在启动时生成代理对象,并将代理对象关联到目标 Bean 上。这样在运行时,AOP 操作可以被执行。
-
Web 应用初始化(仅适用于 Web 项目):
- 对于 Spring Web 项目,容器还会初始化 Web 应用相关的配置,如 DispatcherServlet、HandlerMapping、ViewResolver 等。
-
执行自定义逻辑:
- 开发者可以通过编写自定义的初始化逻辑或监听器,在 Spring 启动过程中执行特定的业务逻辑。
-
完成启动过程:
- 当上述步骤完成后,Spring 容器启动过程就算完成了,此时应用程序可以开始接收请求,处理业务逻辑。
总体而言,Spring 的启动流程是一个反射、依赖注入、生命周期管理等多个方面交织在一起的复杂过程。它通过各种配置和扫描机制,实现了组件的自动注册和管理。
SpringBoot
Spring Boot 的启动流程相对于传统的 Spring 框架来说更加简化和自动化。以下是 Spring Boot 的主要启动流程:
-
执行
main
方法:- Spring Boot 应用的启动入口是
main
方法,通常包含SpringApplication.run(Application.class, args)
。
- Spring Boot 应用的启动入口是
-
创建 SpringApplication 对象:
SpringApplication
是 Spring Boot 的启动类,负责启动应用。在main
方法中创建SpringApplication
对象,并传入应用主类和启动参数。
-
解析启动参数:
SpringApplication
解析命令行参数,如--server.port=8080
,并设置相应的配置。
-
推断应用类型:
- 推断应用类型,即判断是 Web 应用还是非 Web 应用。通过类路径、类的存在性等方式进行判断。
-
创建应用上下文(ApplicationContext):
- 根据应用类型创建对应的
ApplicationContext
,可以是AnnotationConfigApplicationContext
(非 Web)或AnnotationConfigServletWebServerApplicationContext
(Web)。 - 在初始化应用上下文的过程中,Spring Boot 会扫描类路径上的所有类,包括第三方 Starter 中的类。
- 根据应用类型创建对应的
-
初始化应用上下文:
- 根据类路径中的类和配置,初始化应用上下文。这包括注册 Bean、扫描组件、加载配置文件等。
- Spring Boot 在初始化应用上下文的过程中,会处理所有的配置类和组件扫描。这时,如果引入了第三方 Starter,Starter 中的自动配置类会被触发。
- 第三方 Starter 通常包含了一些自动配置类,这些类通过条件注解(
@ConditionalOn...
)来判断是否满足特定的条件,如果满足,则进行相应的自动配置。
-
执行 SpringApplicationRunListeners:
- 执行
SpringApplicationRunListeners
中的监听器,通知它们应用正在启动。 - 在执行
SpringApplicationRunListeners
中的监听器时,如果引入了第三方 Starter,其监听器也会被执行。
- 执行
-
加载应用上下文:
- 调用
refresh()
方法加载应用上下文,启动 Spring 容器。 - Starter 中可能包含了一些默认的配置信息,这些配置信息会被加载到应用上下文中。这可以包括默认的 Bean 配置、属性配置等。
- 调用
-
执行 SpringApplicationRunListeners:
- 再次执行
SpringApplicationRunListeners
中的监听器,通知它们应用已经启动。
- 再次执行
-
运行应用:
- 根据应用类型,决定如何运行应用。Web 应用启动内嵌的 Tomcat、Jetty 等容器,非 Web 应用直接执行
main
方法。
- 根据应用类型,决定如何运行应用。Web 应用启动内嵌的 Tomcat、Jetty 等容器,非 Web 应用直接执行
-
关闭应用上下文:
- 当应用关闭时,执行
SpringApplicationRunListeners
中的监听器,通知它们应用即将关闭。
- 当应用关闭时,执行
-
执行关闭钩子:
- 执行 JVM 关闭钩子,确保资源被正确释放。
这是一个简化的 Spring Boot 启动流程,实际上其中还包括了很多细节,如自动配置、条件注解的处理、外部化配置等。Spring Boot 借助自动配置和约定大于配置的原则,简化了开发者的工作,使得应用能够更轻松地启动和运行。