基本信息
文件名称:Spring高频面试题及答案.docx
文件大小:22 KB
总页数:4 页
更新时间:2025-09-25
总字数:约3.87千字
文档摘要

Spring高频面试题及答案

1.说说Spring的核心思想是什么?实际开发中怎么体现的?

答案:Spring核心思想主要是IOC(控制反转)和AOP(面向切面编程)。

IOC简单说就是“把对象创建和管理的权力交给Spring”,比如以前写Service时,要自己newDao对象,现在只要在Dao上加@Repository,Service里用@Autowired注入,Spring会自动帮我们找对应的实现类,改Dao实现时不用动Service,解耦特别明显,比如项目里从MySQL切换到Redis缓存,Dao层改个实现类,Service层完全不用改。

AOP就是“在不修改原代码的情况下,给方法加通用功能”,比如项目里的日志打印、事务控制、异常处理,像我们给Service方法加@Transactional,Spring就会在方法执行前后自动管理事务(开启、提交、回滚),不用在每个方法里写try-catch控制事务,还有打印接口请求日志,写个切面类拦截所有Controller方法,统一记录请求参数和返回值,不用每个接口都写日志代码。

2.SpringBean的生命周期你能说清楚吗?关键步骤有哪些?

答案:Bean的生命周期就是从创建到销毁的全过程,关键步骤大概分这几步:

实例化:Spring通过构造器创建Bean对象(比如调用无参构造);

属性注入:给Bean里@Autowired的属性赋值,比如Service里注入的Dao,这时候才会把Dao对象塞到Service里;

初始化:

先执行BeanPostProcessor的postProcessBeforeInitialization(初始化前处理,比如给Bean加个代理);

再执行自定义初始化方法,比如标了@PostConstruct的方法,或者在XML里配置init-method的方法,项目里常用@PostConstruct做Bean的初始化,比如加载配置文件、初始化连接池;

最后执行BeanPostProcessor的postProcessAfterInitialization(初始化后处理,AOP动态代理就是在这步生成代理对象的);

使用:Bean创建完成后,就可以在其他地方注入使用了;

销毁:容器关闭时,会执行@PreDestroy标注的方法,或者destroy-method配置的方法,比如释放数据库连接、关闭线程池,比如项目里用@PreDestroy关闭Redis的连接池。

3.Spring依赖注入有哪些方式?实际项目中更推荐哪种?为什么?

答案:主要有3种方式:构造器注入、Setter方法注入、字段注入(@Autowired直接标在字段上)。

字段注入最方便,但有缺点:比如不好做单元测试(Mock注入时得用反射),而且可能出现循环依赖没被提前发现;

Setter注入适合“可选依赖”,比如某个Service里的日志组件,有没有都能跑,就用Setter注入,加个@Autowired(required=false);

实际项目里更推荐构造器注入,因为它能强制依赖(必须传的参数在构造器里,少了创建不了Bean),而且Spring默认推荐这种方式,还能避免部分循环依赖问题,比如我们项目里Service层注入Dao,都是用构造器注入,代码里能清楚看到这个Service依赖哪些Bean。

4.Spring事务传播行为有哪些常用的?举个实际场景说明

答案:常用的传播行为主要有4种:

REQUIRED(默认):如果当前有事务,就加入事务;没有就新建一个。比如订单Service的createOrder方法调用库存Service的deductStock方法,两个方法都用默认传播行为,只要createOrder加了@Transactional,deductStock会加入同一个事务,库存扣减失败,订单也会回滚;

REQUIRES_NEW:不管当前有没有事务,都新建一个事务,新事务和原事务独立。比如项目里用户注册成功后要发短信,注册方法加了事务,发短信方法用REQUIRES_NEW,就算注册事务回滚(比如后续保存用户信息失败),短信已经发出去了,不会因为注册回滚而撤销;

SUPPORTS:如果当前有事务就加入,没有就以非事务方式执行。比如查询方法,有时候在事务里调用(比如查订单详情时要关联查库存),就跟着事务走,单独调用时不用事务;

NEVER:不能在事务里执行,否则抛异常。比如某些统计方法,不允许有事务,防止影响统计结果的准确性。

5.@Aut