在Spring的面试中,经常会被问到一些经典的问题,这些问题涵盖了Spring的基本概念、核心特性、工作原理以及在实际项目中的应用。以下是一些Spring面试中最经典的题目:
一、Spring概述
-
什么是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框架的支持)等。
- 回答要点 :
-
Spring框架的设计目标、设计理念和核心是什么?
- 回答要点 :
- 设计目标:为开发者提供一个一站式轻量级应用开发平台。
- 设计理念:支持POJO和JavaBean开发方式,使应用面向接口开发,充分支持OO(面向对象)设计方法;通过IoC容器实现对象耦合关系的管理,并实现依赖反转。
- 核心:IoC容器和AOP模块。通过IoC容器管理POJO对象及其耦合关系;通过AOP以动态非侵入的方式增强服务。
- 回答要点 :
-
Spring的优缺点是什么?
- 回答要点 :
- 优点 :
- 轻量级:框架本身轻量,对资源消耗少。
- 控制反转(IoC):通过容器管理对象的创建和依赖关系,降低组件间的耦合度。
- 面向切面编程(AOP):支持横切关注点的模块化,如日志、事务、安全等,减少代码重复。
- 丰富的功能:提供MVC框架、事务管理、数据访问抽象等。
- 易于测试:支持依赖注入和Mock对象,便于单元测试。
- 缺点 :
- 配置复杂:虽然可以通过注解简化配置,但大型项目的配置仍然较为复杂。
- 学习曲线较陡:对于初学者来说,理解和掌握Spring的全部特性需要一定的时间。
- 优点 :
- 回答要点 :
二、Spring控制反转(IoC)
-
什么是Spring IoC容器?控制反转(IoC)有什么作用?
- 回答要点 :
- IoC容器:是Spring的核心组件,负责管理Bean的创建、配置、组装和生命周期。
- IoC的作用 :
- 解耦:将对象的创建和依赖关系的管理从代码中抽离出来,由容器负责。
- 提高灵活性:可以动态地更换Bean的实现,无需修改代码。
- 易于测试:可以通过配置或编程方式注入Mock对象,便于单元测试。
- 回答要点 :
-
什么是依赖注入(DI)?DI有哪些实现方式?
- 回答要点 :
- 依赖注入:是IoC的一种实现方式,指在程序运行时,由容器动态地将依赖关系注入到对象中。
- 实现方式 :
- 构造器注入:通过构造器参数传递依赖对象。
- Setter方法注入:通过调用对象的Setter方法注入依赖对象。
- 接口注入:较少使用,通过实现特定接口的方法传递依赖对象。
- 回答要点 :
-
BeanFactory和ApplicationContext有什么区别?
- 回答要点 :
- BeanFactory :
- 是Spring IoC容器的基础接口,提供了基本的Bean管理功能。
- 采用延迟加载策略,只有在使用到Bean时才进行实例化。
- ApplicationContext :
- 是BeanFactory的子接口,提供了更多高级功能,如事件发布、国际化支持等。
- 在容器启动时即进行Bean的实例化,便于在容器启动时进行检查和错误处理。
- BeanFactory :
- 回答要点 :
三、Spring Beans
-
什么是Spring Bean?Spring Bean的生命周期是怎样的?
- 回答要点 :
- Spring Bean:是Spring框架管理的对象,可以是任何Java对象。
- 生命周期 :
- 实例化:根据配置信息创建Bean实例。
- 属性注入:为Bean注入依赖关系。
- 初始化 :调用Bean的初始化方法(如实现了
InitializingBean
接口的afterPropertiesSet
方法,或配置了init-method
)。 - 使用:Bean被容器管理,可以随时使用。
- 销毁 :在容器关闭时,调用Bean的销毁方法(如实现了
DisposableBean
接口的destroy
方法,或配置了destroy-method
)。
- 回答要点 :
-
Spring支持哪些Bean的作用域?
- 回答要点 :
- singleton:默认值,容器中只有一个Bean实例。
- prototype:每次请求都会创建一个新的Bean实例。
- request:每次HTTP请求创建一个新的Bean实例(仅适用于Web应用)。
- session:每个用户会话创建一个新的Bean实例(仅适用于Web应用)。
- application:整个Web应用共享一个Bean实例(仅适用于Web应用)。
- websocket:每个WebSocket会话创建一个新的Bean实例(仅适用于WebSocket应用)。
- 回答要点 :
-
Spring如何解决循环依赖问题?
- 回答要点 :
- Spring通过三级缓存 机制解决循环依赖问题:
- 一级缓存:存放已经完全初始化的Bean。
- 二级缓存:存放早期暴露的Bean(尚未完成属性注入,但已经完成了实例化)。
- 三级缓存:存放正在创建的Bean的早期引用(尚未完成实例化)。
- 当A、B两个Bean存在循环依赖时,Spring会先创建A的早期引用放入三级缓存,然后创建B的实例,在创建B的过程中发现依赖A,此时从三级缓存中获取A的早期引用放入二级缓存,完成B的属性注入后,将B放入一级缓存,然后完成A的剩余属性注入,最后将A放入一级缓存。
- Spring通过三级缓存 机制解决循环依赖问题:
- 回答要点 :
四、Spring面向切面编程(AOP)
-
什么是AOP?Spring AOP有哪些实现方式?
- 回答要点 :
- AOP:面向切面编程,是一种编程范式,允许将横切关注点(如日志、事务、安全等)与业务逻辑分离,提高代码的可重用性和可维护性。
- 实现方式 :
- 基于代理的实现 :
- JDK动态代理:为实现了接口的类生成代理对象。
- CGLIB动态代理:为未实现接口的类生成代理对象(通过继承目标类)。
- 基于AspectJ的实现:支持编译时织入和加载时织入,功能更强大但使用较少。
- 基于代理的实现 :
- 回答要点 :
-
Spring AOP中的连接点(Join point)、切点(Pointcut)、通知(Advice)、切面(Aspect)等概念是什么?
- 回答要点 :
- 连接点:程序执行过程中能够插入横切关注点的点,通常是方法调用。
- 切点:用于定义要对哪些连接点进行拦截,可以通过表达式指定。
- 通知:在连接点执行的增强逻辑,如前置通知、后置通知、环绕通知等。
- 切面:切点和通知的组合,用于定义横切关注点的模块。
- 回答要点 :
-
Spring AOP中的JDK动态代理和CGLIB动态代理有什么区别?
- 回答要点 :
- JDK动态代理 :
- 只能为实现了接口的类生成代理对象。
- 基于Java反射机制实现,性能相对较高。
- CGLIB动态代理 :
- 可以为未实现接口的类生成代理对象(通过继承目标类)。
- 性能相对较低,但适用范围更广。
- JDK动态代理 :
- 回答要点 :
五、Spring MVC
-
Spring MVC的运行流程是怎样的?
- 回答要点 :
- 请求到达前端控制器(DispatcherServlet)。
- DispatcherServlet请求HandlerMapping查找Handler(可以根据XML配置、注解进行查找)。
- HandlerMapping返回Handler给DispatcherServlet。
- DispatcherServlet调用HandlerAdapter执行Handler。
- Handler执行完成,返回ModelAndView给DispatcherServlet。
- DispatcherServlet请求视图解析器(ViewResolver)解析视图。
- 视图解析器返回视图对象给DispatcherServlet。
- DispatcherServlet进行视图渲染,将模型数据填充到视图中。
- 响应结果返回给客户端。
- 回答要点 :
-
@Controller、@Service、@Repository、@Component注解有什么区别?
- 回答要点 :
- @Controller:用于标注控制层组件。
- @Service:用于标注服务层组件。
- @Repository:用于标注数据访问层组件。
- @Component:通用注解,可以标注任何组件,但建议用于标注不属于以上三层的组件。
- 回答要点 :
六、Spring事务管理
-
Spring支持哪些事务管理类型?Spring事务的实现方式和实现原理是什么?
- 回答要点 :
- 事务管理类型 :
- 编程式事务管理:通过编程的方式管理事务,灵活性高但代码复杂
- 事务管理类型 :
- 回答要点 :