Spring经典面试题

在Spring的面试中,经常会被问到一些经典的问题,这些问题涵盖了Spring的基本概念、核心特性、工作原理以及在实际项目中的应用。以下是一些Spring面试中最经典的题目:

一、Spring概述

  1. 什么是Spring框架?Spring框架有哪些主要模块?

    • 回答要点
      • Spring是一个轻量级的Java EE框架,旨在简化企业级应用开发。
      • Spring框架的核心模块包括Spring Core(提供IoC和DI服务)、Spring Context(提供框架式的Bean访问方式及企业级功能)、Spring AOP(提供面向切面编程的支持)、Spring Web(提供Web应用开发支持)、Spring MVC(提供MVC模式实现)、Spring DAO(提供对JDBC的抽象封装)、Spring ORM(对现有的ORM框架的支持)等。
  2. Spring框架的设计目标、设计理念和核心是什么?

    • 回答要点
      • 设计目标:为开发者提供一个一站式轻量级应用开发平台。
      • 设计理念:支持POJO和JavaBean开发方式,使应用面向接口开发,充分支持OO(面向对象)设计方法;通过IoC容器实现对象耦合关系的管理,并实现依赖反转。
      • 核心:IoC容器和AOP模块。通过IoC容器管理POJO对象及其耦合关系;通过AOP以动态非侵入的方式增强服务。
  3. Spring的优缺点是什么?

    • 回答要点
      • 优点
        • 轻量级:框架本身轻量,对资源消耗少。
        • 控制反转(IoC):通过容器管理对象的创建和依赖关系,降低组件间的耦合度。
        • 面向切面编程(AOP):支持横切关注点的模块化,如日志、事务、安全等,减少代码重复。
        • 丰富的功能:提供MVC框架、事务管理、数据访问抽象等。
        • 易于测试:支持依赖注入和Mock对象,便于单元测试。
      • 缺点
        • 配置复杂:虽然可以通过注解简化配置,但大型项目的配置仍然较为复杂。
        • 学习曲线较陡:对于初学者来说,理解和掌握Spring的全部特性需要一定的时间。

二、Spring控制反转(IoC)

  1. 什么是Spring IoC容器?控制反转(IoC)有什么作用?

    • 回答要点
      • IoC容器:是Spring的核心组件,负责管理Bean的创建、配置、组装和生命周期。
      • IoC的作用
        • 解耦:将对象的创建和依赖关系的管理从代码中抽离出来,由容器负责。
        • 提高灵活性:可以动态地更换Bean的实现,无需修改代码。
        • 易于测试:可以通过配置或编程方式注入Mock对象,便于单元测试。
  2. 什么是依赖注入(DI)?DI有哪些实现方式?

    • 回答要点
      • 依赖注入:是IoC的一种实现方式,指在程序运行时,由容器动态地将依赖关系注入到对象中。
      • 实现方式
        • 构造器注入:通过构造器参数传递依赖对象。
        • Setter方法注入:通过调用对象的Setter方法注入依赖对象。
        • 接口注入:较少使用,通过实现特定接口的方法传递依赖对象。
  3. BeanFactory和ApplicationContext有什么区别?

    • 回答要点
      • BeanFactory
        • 是Spring IoC容器的基础接口,提供了基本的Bean管理功能。
        • 采用延迟加载策略,只有在使用到Bean时才进行实例化。
      • ApplicationContext
        • 是BeanFactory的子接口,提供了更多高级功能,如事件发布、国际化支持等。
        • 在容器启动时即进行Bean的实例化,便于在容器启动时进行检查和错误处理。

三、Spring Beans

  1. 什么是Spring Bean?Spring Bean的生命周期是怎样的?

    • 回答要点
      • Spring Bean:是Spring框架管理的对象,可以是任何Java对象。
      • 生命周期
        • 实例化:根据配置信息创建Bean实例。
        • 属性注入:为Bean注入依赖关系。
        • 初始化 :调用Bean的初始化方法(如实现了InitializingBean接口的afterPropertiesSet方法,或配置了init-method)。
        • 使用:Bean被容器管理,可以随时使用。
        • 销毁 :在容器关闭时,调用Bean的销毁方法(如实现了DisposableBean接口的destroy方法,或配置了destroy-method)。
  2. Spring支持哪些Bean的作用域?

    • 回答要点
      • singleton:默认值,容器中只有一个Bean实例。
      • prototype:每次请求都会创建一个新的Bean实例。
      • request:每次HTTP请求创建一个新的Bean实例(仅适用于Web应用)。
      • session:每个用户会话创建一个新的Bean实例(仅适用于Web应用)。
      • application:整个Web应用共享一个Bean实例(仅适用于Web应用)。
      • websocket:每个WebSocket会话创建一个新的Bean实例(仅适用于WebSocket应用)。
  3. Spring如何解决循环依赖问题?

    • 回答要点
      • Spring通过三级缓存 机制解决循环依赖问题:
        • 一级缓存:存放已经完全初始化的Bean。
        • 二级缓存:存放早期暴露的Bean(尚未完成属性注入,但已经完成了实例化)。
        • 三级缓存:存放正在创建的Bean的早期引用(尚未完成实例化)。
      • 当A、B两个Bean存在循环依赖时,Spring会先创建A的早期引用放入三级缓存,然后创建B的实例,在创建B的过程中发现依赖A,此时从三级缓存中获取A的早期引用放入二级缓存,完成B的属性注入后,将B放入一级缓存,然后完成A的剩余属性注入,最后将A放入一级缓存。

四、Spring面向切面编程(AOP)

  1. 什么是AOP?Spring AOP有哪些实现方式?

    • 回答要点
      • AOP:面向切面编程,是一种编程范式,允许将横切关注点(如日志、事务、安全等)与业务逻辑分离,提高代码的可重用性和可维护性。
      • 实现方式
        • 基于代理的实现
          • JDK动态代理:为实现了接口的类生成代理对象。
          • CGLIB动态代理:为未实现接口的类生成代理对象(通过继承目标类)。
        • 基于AspectJ的实现:支持编译时织入和加载时织入,功能更强大但使用较少。
  2. Spring AOP中的连接点(Join point)、切点(Pointcut)、通知(Advice)、切面(Aspect)等概念是什么?

    • 回答要点
      • 连接点:程序执行过程中能够插入横切关注点的点,通常是方法调用。
      • 切点:用于定义要对哪些连接点进行拦截,可以通过表达式指定。
      • 通知:在连接点执行的增强逻辑,如前置通知、后置通知、环绕通知等。
      • 切面:切点和通知的组合,用于定义横切关注点的模块。
  3. Spring AOP中的JDK动态代理和CGLIB动态代理有什么区别?

    • 回答要点
      • JDK动态代理
        • 只能为实现了接口的类生成代理对象。
        • 基于Java反射机制实现,性能相对较高。
      • CGLIB动态代理
        • 可以为未实现接口的类生成代理对象(通过继承目标类)。
        • 性能相对较低,但适用范围更广。

五、Spring MVC

  1. Spring MVC的运行流程是怎样的?

    • 回答要点
      • 请求到达前端控制器(DispatcherServlet)
      • DispatcherServlet请求HandlerMapping查找Handler(可以根据XML配置、注解进行查找)。
      • HandlerMapping返回Handler给DispatcherServlet
      • DispatcherServlet调用HandlerAdapter执行Handler
      • Handler执行完成,返回ModelAndView给DispatcherServlet
      • DispatcherServlet请求视图解析器(ViewResolver)解析视图
      • 视图解析器返回视图对象给DispatcherServlet
      • DispatcherServlet进行视图渲染,将模型数据填充到视图中
      • 响应结果返回给客户端
  2. @Controller、@Service、@Repository、@Component注解有什么区别?

    • 回答要点
      • @Controller:用于标注控制层组件。
      • @Service:用于标注服务层组件。
      • @Repository:用于标注数据访问层组件。
      • @Component:通用注解,可以标注任何组件,但建议用于标注不属于以上三层的组件。

六、Spring事务管理

  1. Spring支持哪些事务管理类型?Spring事务的实现方式和实现原理是什么?

    • 回答要点
      • 事务管理类型
        • 编程式事务管理:通过编程的方式管理事务,灵活性高但代码复杂
相关推荐
AI人工智能+电脑小能手5 小时前
【大白话说Java面试题 第87题】【Mysql篇】第17题:分布式事务的实现原理?
java·数据库·分布式·mysql·面试
红尘散仙6 小时前
我把终端小说阅读器接上了 AI Agent:TRNovel 现在能用 skill 生成书源了
人工智能·后端·rust
来杯@Java6 小时前
图书管理系统(基于springboot+vue前后端分离的项目)计算机毕业设计java
java·spring boot·spring·vue·毕业设计·mybatis·课程设计
卷毛的技术笔记7 小时前
告别硬编码!Spring AI Alibaba 实现 AI Agent 智能工具调用(Tool Calling)
java·人工智能·后端·python·spring·ai编程
编程大师哥7 小时前
匿名函数 lambda + 高阶函数
java·python·算法
会编程的土豆7 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
東雪木7 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
Cosolar7 小时前
从零写一个 Attention Is All You Need
人工智能·面试·架构
adrninistrat0r7 小时前
Java调用链MCP分析工具
java·python·ai编程
喵个咪8 小时前
GoWind Toolkit Go后端代码生成 完整全流程实战
后端·go·orm