Spring 面试题, 说说 Spring 启动过程?
Spring 面试题, 说说 Spring 启动过程?
QA
Step 1
Q:: Spring 启动过程的主要步骤是什么?
A:: Spring 启动过程主要分为以下几个步骤:
1.
创建 Spring 容器:通过调用 AnnotationConfigApplicationContext
或 ClassPathXmlApplicationContext
等上下文容器的构造函数来启动。
2.
注册配置类或 XML 配置文件:在上下文中注册配置类或加载 XML 配置文件,定义 Bean 和依赖关系。
3.
扫描和解析 Bean:容器会扫描配置文件或注解,解析并创建 BeanDefinition,并将其注册到 Bean 工厂中。
4.
实例化和初始化 Bean:容器根据 BeanDefinition 实例化 Bean,并进行依赖注入。Bean 会依次经历初始化、属性设置、@PostConstruct
注解标记的方法执行等生命周期步骤。
5.
启动应用上下文:容器完成 Bean 的创建和初始化后,发布 ContextRefreshedEvent
事件,表示容器已经准备就绪,可以接受请求。
6.
应用启动完成:Spring 容器准备好后,应用进入运行状态。
Step 2
Q:: 什么是 BeanFactory 和 ApplicationContext,它们有什么区别?
A:: BeanFactory 是 Spring 中最基础的 IoC 容器,负责管理 Bean 的加载、实例化、依赖注入等基本功能。ApplicationContext 是 BeanFactory 的高级子接口,提供了更多的功能,如事件发布、国际化支持和不同层次的上下文支持。
区别包括:
1.
功能:ApplicationContext 提供了 BeanFactory 所不具备的高级功能。
2.
Bean 的加载时机:BeanFactory 采用延迟加载,只有在第一次使用时才会创建 Bean;ApplicationContext 在启动时会立即加载并实例化所有单例 Bean。
3.
扩展能力:ApplicationContext 支持事件机制、AOP、声明式事务等功能,而 BeanFactory 则没有这些扩展。
Step 3
Q:: Spring Boot 是如何简化 Spring 应用开发的?
A:: Spring Boot 通过约定优于配置、自动配置、内嵌服务器、Starter 模块等方式极大地简化了 Spring 应用的开发。
1.
约定优于配置:Spring Boot 提供了一些默认配置,使得开发者无需手动配置繁琐的 XML 或注解。
2.
自动配置:Spring Boot 的自动配置机制基于类路径中的依赖自动配置合适的 Bean,极大地减少了手动配置。
3.
内嵌服务器:Spring Boot 提供了内嵌的 Tomcat、Jetty 等服务器,使得应用可以打包成可执行 JAR 文件并直接运行。
4.
Starter 模块:Spring Boot 提供了一系列 Starter 模块,包含了常用的依赖和默认配置,进一步简化了依赖管理。
Step 4
Q:: Spring AOP 的基本概念和使用场景是什么?
A:: Spring AOP 是一种面向切面编程的实现,允许将横切关注点(如日志记录、事务管理、权限控制)与业务逻辑代码分离。
1.
基本概念:
-
Aspect(切面):封装横切关注点的模块。
-
Advice(通知):切面执行的动作,如前置通知、后置通知、环绕通知等。
-
Pointcut(切入点):定义 Advice 应该应用到哪些连接点上。
-
JoinPoint(连接点):程序执行的某个具体点,例如方法调用。
-
Weaving(织入):将切面应用到目标对象上,生成代理对象的过程。
2.
使用场景:AOP 常用于日志记录、性能监控、安全控制、事务管理等场景。
Step 5
Q:: 什么是 Spring Bean 的生命周期?
A:: Spring Bean 的生命周期包括以下几个阶段:
1.
实例化:Spring 容器通过调用构造方法创建 Bean 实例。
2.
属性注入:Spring 容器根据 Bean 的配置文件或注解设置属性。
3.
BeanNameAware:如果 Bean 实现了 BeanNameAware
接口,Spring 容器会调用 setBeanName
方法传递 Bean 的名称。
4.
BeanFactoryAware:如果 Bean 实现了 BeanFactoryAware
接口,Spring 容器会调用 setBeanFactory
方法传递 BeanFactory。
5.
BeanPostProcessor:在初始化前后,Spring 容器会调用 BeanPostProcessor
的 postProcessBeforeInitialization
和 postProcessAfterInitialization
方法对 Bean 进行处理。
6.
初始化:如果 Bean 定义了 init-method
或实现了 InitializingBean
接口,Spring 容器会调用相应的初始化方法。
7.
销毁:如果 Bean 定义了 destroy-method
或实现了 DisposableBean
接口,当容器关闭时,会调用相应的销毁方法。