Spring/SpringBoot部分[2025/1/6 ~ 2025/1/12]
- 1. 说说 Spring 启动过程?
- 2. 说说 Springboot 的启动流程?
- 3. 你了解的 Spring 都用到哪些设计模式?
- 4. Spring 有哪几种事务传播行为?
- 5. SpringBoot 是如何实现自动配置的?
- 6. Spring Boot 是如何通过 main 方法启动 web 项目的?
- 7. Spring Boot 的核心特性有哪些?
1. 说说 Spring 启动过程?
首先加载配置文件, 初始化Spring容器ApplicationContext; 扫描Bean定义获取BeanDefinition; 解析BeanDefinition实例化Bean, 注入依赖, 处理Bean周期初始化方法: InitializingBean和BeanPostProcessor, 发布一些时间比如容器启动事件, 完成启动
加载配置文件,初始化容器
:Spring 启动时首先会读取配置文件(如 XML 配置文件、Java Config 类等),包括配置数据库连接、事务管理、AOP 配置等。实例化容器
:Spring 根据配置文件中的信息创建容器 ApplicationContext,在容器启动阶段实例化 BeanFactory,并加载容器中的 BeanDefinitions。解析 BeanDefinitions
:Spring 容器会解析配置文件中的 BeanDefinitions,即声明的 Bean 元数据,包括 Bean 的作用域、依赖关系等信息。实例化 Bean
:Spring 根据 BeanDefinitions 实例化 Bean 对象,将其放入容器管理。注入依赖
:Spring 进行依赖注入,将 Bean 之间的依赖关系进行注入,包括构造函数注入、属性注入等。处理 Bean 生命周期初始化方法:
Spring 调用 Bean 初始化方法(如果有定义的话),对 Bean 进行初始化。 如果 Bean 实现了 InitializingBean 接口,Spring 会调用其 afterPropertiesSet 方法。处理 BeanPostProcessors:
容器定义了很多 BeanPostProcessor,处理其中的自定义逻辑,例如 postProcessBeforeInitialization 会在 Bean 初始化前调用, postProcessAfterInitialization 则在之后调用。 Spring AOP 代理也在这个阶段生成。发布事件
:Spring 可能会在启动过程中发布一些事件,比如容器启动事件。完成启动
:当所有 Bean 初始化完毕、依赖注入完成、AOP 配置生效等都准备就绪时,Spring 容器启动完成。
2. 说说 Springboot 的启动流程?
启动 main() 方法
: 应用从 main() 方法启动,并通过 SpringApplication.run() 引导应用启动。创建SpringApplication
: 应用会创建SpringApplication 对象,推断应用类型、设置初始化器、设置启动监听器、确定主应用类。准备环境(ConfigurableEnvironment)
: Spring Boot 在启动过程中准备应用环境
,加载配置文件
、系统环境变量
以及命令行参数。创建并刷新 ApplicationContext
: 创建应用上下文ApplicationContext
,加载配置类
和自动配置类,注册 Bean
并执行依赖注入等初始化操作(InitializingBean和BeanPostProcessors)。- 在刷新上下文时启动嵌入式 Web 服务器
: 于 Web 应用,Spring Boot 会自动启动嵌入式 Web 容器(如 Tomcat),并
注册相关的 Servlet 和 Filter`。 发布应用已启动事件
: 对应监听 stated 事件逻辑会被触发执行 CommandLineRunner 和 ApplicationRunner
: 在应用启动完成后,执行实现了 CommandLineRunner 和 ApplicationRunner 接口的初始化逻辑。发布 ready 事件、应用启动完成
: 触发 ApplicationReadyEvent,应用进入运行状态,处理业务请求或任务。
3. 你了解的 Spring 都用到哪些设计模式?
- 工厂模式,从名字就能看出来是 BeanFactory,整个 Spring IOC 就是一个工厂。
- 模板方法,例如 JdbcTemplate、RestTemplate,名字是 xxxTemplate 的都是模板。
- 代理模式,AOP 整个都是代理模式。
- 单例模式,默认情况下 Bean 都是单例的。
- 责任链模式,比如 Spring MVC 中的拦截器,多个拦截器串联起来就形成了责任链。
- 观察者模式,在 Spring 中的监听器实现。
- 适配器模式,在 Spring MVC 中提到的 handlerAdapter 其实就是适配器。
4. Spring 有哪几种事务传播行为?
- PROPAGATION_REQUIRED(默认)(
有用, 没有new
) 如果当前存在事务,则用当前事务,如果没有事务则新起一个事务 - PROPAGATION_SUPPORTS(
有用, 没有不用
) 支持当前事务,如果不存在,则以非事务方式执行 - PROPAGATION_NOT_SUPPORTED(
不用
) 不支持当前事务,始终以非事务方式执行 - PROPAGATION_MANDATORY(
必须有
) 支持当前事务,如果不存在,则抛出异常 - PROPAGATION_NEVER(
必须没有
) 不支持当前事务,如果当前存在事务,则抛出异常 - PROPAGATION_REQUIRES_NEW(
始终new
) 创建一个新事务,如果存在当前事务,则挂起当前事务 - PROPAGATION_NESTED(
嵌套事务
) 如果当前事务存在,则在嵌套事务中执行,内层事务依赖外层事务,如果外层失败,则会回滚内层,内层失败不影响外层。
5. SpringBoot 是如何实现自动配置的?
Spring Boot 的自动配置是通过 @EnableAutoConfiguration
注解实现,这个注解包含@Import({AutoConfigurationImportSelector.class})注解,导入的这个类会去扫描 classpath 下所有的 META-INF/spring.factories
中的文件,根据文件中指定的配置类
加载相应的 Bean 的自动配置。 这些 Bean 通常会使用 @ConditionalOnClass、@ConditionalOnMissingBean、@ConditionalOnProperty 等条件注解。来控制自动配置的加载条件,例如仅在类路径中存在某个类时,才加载某些配置。
6. Spring Boot 是如何通过 main 方法启动 web 项目的?
- SpringApplication.run():这是启动的入口,它会创建 Spring 应用上下文,并执行自动配置。
- 创建应用上下文:为 Web 应用创建 AnnotationConfigServletWebServerApplicationContext 上下文。
- 启动内嵌 Web 服务器:在 refreshContext() 阶段启动内嵌的 Web 服务器(如 Tomcat)。
- 自动配置:通过 @EnableAutoConfiguration 自动配置各种组件,如 DispatcherServlet。
- 请求处理:内嵌的 DispatcherServlet 负责处理 HTTP 请求。
7. Spring Boot 的核心特性有哪些?
开箱即用,内嵌服务器
。这个特点是程序员最直观的感受,相较于原本的开发,spring boot 可以省略以前繁琐的 tomcat 配置,快速创建一个 web 容器。自动化配置
。在 spring boot 中我们可以按照自动配置的规定(将自动加载的 bean 写在自己jar 包当中的 meta/info/spring.factories 文件中或者通过的注解 @Import 导入时加载指定的类)这样我们的配置类就会被 Springboot 自动加载到容器当中。 同时还支持通过改写yaml 和 propreties来覆盖默认配置支持 jar 包运行
。传统部署web 容器都是打成 war 包放在 tomcat 中。spring boot 可以打成 jar 包只要有 java 运行环境即可运行 web 容器。监控、健康检查支持
。spring boot Actuator 支持开发者监控应用的运行状态,包括性能指标、应用信息和日志级别控制等。完整的生态支持
。spring boot 可以随意整合 spring 全家桶的支持。像 Actuator 健康检查模块,Spring Data JPA 数据库模块,Spring Test 测试模块。这些都可以很优雅的集成在 springboot 当中。