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事务的实现方式和实现原理是什么?

    • 回答要点
      • 事务管理类型
        • 编程式事务管理:通过编程的方式管理事务,灵活性高但代码复杂
相关推荐
C++小厨神3 小时前
Java语言的循环实现
开发语言·后端·golang
Quantum&Coder4 小时前
Ruby语言的数据库编程
开发语言·后端·golang
ByteBlossom6664 小时前
Ruby语言的网络编程
开发语言·后端·golang
J不A秃V头A4 小时前
自定义SqlSessionFactory时mybatis-config.xml失效
java·开发语言
静水楼台x4 小时前
Java中json的一点理解
java·后端·json
晴空๓5 小时前
如何查看特定版本的Spring源码
java·spring boot·spring
Yeats_Liao5 小时前
Java List过滤 Stream API filter() 应用
java·开发语言·list
qingy_20466 小时前
【算法】图解二叉树的前中后序遍历
java·开发语言·算法
macrozheng6 小时前
Jenkins+Docker一键打包部署项目!步骤齐全,少走坑路!
java·spring boot·后端·docker·jenkins
!!!5256 小时前
MyBatis-增删改查操作&一些细节
java·数据库·spring boot·mybatis