【P0】Spring 面试篇
Spring 概述?
什么是 Spring?
Java 应用开发的基础性支持平台,解决依赖管理、资源配置等基础问题,让开发者专注业务逻辑。
- 基础定位:轻量级、一站式的 Java 企业级框架。
- 根本使命:解决系统层间耦合度高、配置复杂的问题,简化 Java 开发流程。
- 核心能力:通过 DI(依赖注入)实现依赖解耦,通过 AOP(面向切面编程)抽取跨模块共性功能。
- 落地政策:依托 POJO 开发、面向接口编程、声明式开发、模板类等方式,从根源降低开发复杂性,成为 Java 企业级开发的 “事实标准” 框架。
Spring核心概念
IOC(控制反转/依赖注入):
- 核心思想:
- 不直接创建对象,声明依赖由容器组装,将对象控制权从代码转移到容器,实现组件解耦与灵活组装。
- 本质:运行时由装配器绑定对象耦合,打破编译期固定关联
- 场景:业务流程由装配器实例化的对象关系图决定
- 与传统编程差异:
- 传统:对象关联预先设定,编译期固定
- IOC:关联关系抽象化,通过依赖注入绑定
- 关键逻辑:
- 开发者仅在代码中声明所需对象(如服务、组件),不通过
<font style="color:#000000;">new</font>
创建,不硬编码依赖关系; - 对象创建、属性设置及依赖建立,由 IOC 容器负责;
- 依赖关系通过配置文件或注解(如
<font style="color:#000000;">@Autowired</font>
)描述,容器依此自动组合组件与服务; - 使用对象时直接从容器获取,无需关注其创建与组装过程。
- 开发者仅在代码中声明所需对象(如服务、组件),不通过
- Java注入方式:
- 构造器注入:通过构造方法传入依赖
- Setter 注入:通过 setXxx () 方法设置依赖
- 接口注入:实现特定接口方法注入依赖
AOP(面向切面编程):
- 核心思想:
- 将跨类共性行为封装为可重用模块,实现“业务逻辑与通用功能解耦”减少代码冗余,提升可维护性。
- 关键逻辑:
- 抽离影响多类的通用功能(如日志、权限校验),封装为独立 “切面” 模块;
- 无需在各类 / 方法中重复编写通用代码,通过声明式方式指定切面应用位置;
- 调用业务方法时,AOP 框架自动将切面逻辑织入执行流程(如方法执行前输出日志)。
Spring框架设计目标,设计理念,核心是什么?
- 设计目标:提供一站式轻量级应用开发平台。
- 设计理念
- 面向 POJO/JavaBean:支持基于简单 Java 对象的开发,避免侵入业务代码。
- 面向接口与 OOP:强制面向接口编程,遵循面向对象设计原则。
- 依赖反转解耦:通过 IOC 管理对象间耦合关系。
- 框架核心:IOC容器和AOP模块。
- IOC 容器:管理 POJO 对象及对象间耦合关系。
- AOP 模块:以动态非侵入方式增强服务。
Spring的优缺点是什么?
优点:(提升开发效率与系统灵活性)
- 依赖注入(DI):清晰化依赖关系,降低耦合,便于维护
- 轻量 IOC 容器:资源占用低,比 EJB 更高效,适合资源有限场景
- 解耦便捷,简化开发:IOC 接管对象生命周期及关系维护,减轻对象管理负担
- 兼容整合性:灵活利用成熟技术,减少重复开发,提升效率
- 模块化设计:按需选用,减少应用体积,简化配置
- 原生支持 AOP 编程:内置面向切面编程能力,便于实现通用功能
- 声明式事务管理:无需手动编写事务控制代码,简化事务处理
- 降低 JavaEE API 使用难度:对复杂 API 进行封装,简化开发
- 易集成优秀框架:兼容并蓄,不排斥第三方开源框架
缺点:(感知复杂度与性能、门槛问题)
- 轻量与大而全的感知矛盾:框架功能丰富,可能给人 “不轻量” 的印象
- 依赖反射机制:反射操作对性能有一定影响
- 使用门槛较高:入门学习需要较长时间掌握其核心概念与用法
Spring有哪些应用场景?
应用场景:聚焦 JavaEE 企业级应用开发,是构建 SSH、SSM 等主流技术架构的基础框架。
核心价值:
- 非侵入式设计:以最小化应用代码对框架的依赖为核心目标。
- 一致的 POJO 编程模型:支持直接基于简单 Java 对象(POJO)开发应用。
- 推动优良设计风格:引导采用 “面向对象” 与 “面向接口” 的开发方式,强化代码模块化与抽象性。
详细讲解一下核心容器(SpringContext应用上下文) 模块?
Spring 的基础模块是整个框架的基石,其核心是BeanFactory,它为 Spring 提供了容器能力。
- 定位:整个 Spring 框架的基石,所有 Spring 应用的核心支撑模块。
- 核心:以BeanFactory为核心,通过其实现 “工厂模式”,是 Spring 作为 “容器” 的根本,负责管理对象的创建与依赖关系。
BeanFactory核心作用:
- 实现控制反转(IOC),将对象控制权从代码转移到容器。
- 支持通过
<font style="color:#000000;">XmlBeanFactory</font>
从 XML 配置文件中读取元数据(如 Bean 的定义、属性、依赖关系)。 - 依据 XML 配置自动创建并组装完整的系统 / 应用对象,无需手动处理对象创建与依赖注入。
Spring有哪些事件?
Spring 提供 5 种核心容器事件,对应容器不同生命周期阶段,具体如下:
- ContextRefreshedEvent(上下文更新事件)
- 触发时机:ApplicationContext 初始化 / 更新完成、调用
<font style="color:#000000;">ConfigurableApplicationContext#refresh()</font>
时 - 含义:容器已完成 Bean 初始化与依赖注入,进入可用状态
- 触发时机:ApplicationContext 初始化 / 更新完成、调用
- ContextStartedEvent(上下文开始事件)
- 触发时机:调用
<font style="color:#000000;">ConfigurableApplicationContext#start()</font>
,容器启动 / 重启时 - 含义:容器从停止→运行状态,可触发 Bean 启动相关回调
- 触发时机:调用
- ContextStoppedEvent(上下文停止事件)
- 触发时机:调用
<font style="color:#000000;">ConfigurableApplicationContext#stop()</font>
,容器停止时 - 含义:容器从运行→停止状态,Bean 暂不提供服务但未销毁
- 触发时机:调用
- ContextClosedEvent(上下文关闭事件)
- 触发时机:ApplicationContext 关闭(如 Web 应用关闭、调用
<font style="color:#000000;">close()</font>
)时 - 关键行为:销毁所有单例 Bean,释放容器资源
- 触发时机:ApplicationContext 关闭(如 Web 应用关闭、调用
- RequestHandledEvent(请求处理事件)
- 适用场景:仅 Web 应用
- 触发时机:HTTP 请求处理完成时
- 用途:记录请求日志、统计处理耗时等
Spring 框架中用到了哪些设计模式?
- 代理模式:
- 应用场景:在 AOP(面向切面编程)和远程调用(remoting)中大量使用。
- 实现方式:作为 AOP 思想的底层技术,Spring 采用 JDK Proxy 和 CgLib 类库实现代理。
- 单例模式:
- 体现:Spring 配置文件中定义的 bean 默认采用单例模式,由容器维护唯一实例。
- 模板模式:
- 作用:解决代码重复问题,封装固定流程,暴露可变部分供扩展。
- 典型示例:
<font style="color:#000000;">RestTemplate</font>
、<font style="color:#000000;">JmsTemplate</font>
、<font style="color:#000000;">JpaTemplate</font>
等模板类。
- 委派模式:
- 应用:Spring 通过
<font style="color:#000000;">DispatcherServlet</font>
实现请求分发,将请求委派给相应的处理器处理。
- 应用:Spring 通过
- 工厂模式:
- 核心体现:
<font style="color:#000000;">BeanFactory</font>
作为创建对象实例的工厂,是<font style="color:#000000;">BeanFactory</font>
/<font style="color:#000000;">ApplicationContext</font>
接口的核心理念,负责 Bean 的实例化与管理。
- 核心体现:
Spring 框架中如何有效的使用 JDBC ?
- 核心优势:使用 Spring JDBC 可大幅减轻资源管理(如连接创建 / 关闭)与错误处理的开发代价,开发者仅需关注通过
<font style="color:#000000;">statements</font>
和<font style="color:#000000;">queries</font>
语句实现数据库数据的存取。 - 关键实现:Spring 框架通过 JdbcTemplate 模板类 优化 JDBC 使用效率,是 Spring JDBC 功能落地的核心组件。
SpringIOC 容器
什么是SpringIOC?
核心定义:
- 将对象调用权从程序代码转移到外部容器,实现“控制权反转”,由容器而非代码直接操控对象组件
核心职责:
- 全权管理对象全生命周期,涵盖对象创建、依赖注入DI、对象装配、对象配置,无需开发者手动操作
基础包:
- 由 org.springframework.beans 和 org.springframework.context 包协同构成,支撑容器配置与功能实现。
BeanFactory 接口:
- IOC容器基础接口,提供先进配置机制,支持任意类型对象配置管理,对象创建和依赖注入的底层核心
ApplicationContext 接口:BeanFactory 的子接口,继承基础能力并扩展:
- 易与 Spring AOP 集成,简化切面编程配置
- 提供 message resource 处理,支持国际化
- 支持事件传播,实现容器内对象通信
- 提供应用层专项配置(如 WebApplicationContext 适配 Web 场景)
控制反转(IOC)有什么作用?
Spring IOC 的核心价值在于接管对象的创建与依赖管理,解决复杂依赖的维护难题。
- 全托管对象生命周期。
- 解耦依赖关系。
- 支持对象创建过程的增强。
SpringIOC的优点?
- 降低代码量:IOC/依赖注入机制,不需要手动创建对象
- 简化测试:无需依赖单例模式获取对象
- 低代价实现松耦合:以最小的代码侵入性(如仅通过注解声明依赖),将对象间的依赖关系交由容器管理,避免硬编码耦合,实现组件间的松散关联,降低修改与维护成本
- 灵活的初始化策略:IOC支持饿汉式、懒汉式两种初始化策略
SpringIOC的实现机制?
SpriIOC底层核心依赖:工厂模式+反射机制。
- 工厂模式:提供统一管理对象创建的架构
- 反射机制:实现了根据配置动态生成对象的灵活性
interface Fruit {public abstract void eat();
}
class Apple implements Fruit {public void eat(){System.out.println("Apple");}
}
class Orange implements Fruit {public void eat(){System.out.println("Orange");}
}
class Factory {public static Fruit getInstance(String ClassName) {Fruit f=null;try {f=