Spring面试18问:从基础到进阶的全面解析
2025.09.25 14:51浏览量:1简介:本文围绕Spring框架面试中常见的18个核心问题展开,涵盖IoC/AOP原理、事务管理、MVC机制等关键技术点,结合代码示例与场景分析,为开发者提供系统化的复习指南。
一、Spring核心概念
1. Spring框架的核心特性是什么?
Spring的核心是IoC(控制反转)和AOP(面向切面编程)。IoC通过容器管理Bean生命周期,解耦组件依赖;AOP通过动态代理实现横切关注点(如日志、事务)的模块化。例如:
// 依赖注入示例@Servicepublic class UserService {@Autowiredprivate UserRepository repository; // 由容器自动注入}
2. Bean的作用域有哪些?如何自定义作用域?
默认提供Singleton(单例)和Prototype(原型),扩展需实现Scope接口并通过ConfigurableBeanFactory.registerScope()注册。
二、IoC容器与依赖注入
3. @Autowired与@Resource的区别?
@Autowired:按类型注入,支持required=false@Resource:按名称注入(默认),兼容JSR-250标准
4. 如何解决循环依赖?
Spring通过三级缓存(Singleton Objects、Early Singleton Objects、Singleton Factories)和代理对象提前暴露解决属性注入的循环依赖,但构造器注入无法自动处理。
三、AOP实现机制
5. AOP的两种代理方式及适用场景
- JDK动态代理:基于接口,适用于实现类
- CGLIB代理:通过继承,适用于无接口类
配置示例:
6. 切点表达式如何编写?<aop:aspectj-autoproxy proxy-target-class="true"/> <!-- 强制使用CGLIB -->
使用AspectJ表达式,例如:@Pointcut("execution(* com.example.service.*.*(..))")public void serviceMethods() {}
四、事务管理
7. @Transactional的传播行为有哪些?
- REQUIRED(默认):加入当前事务
- REQUIRES_NEW:新建事务,挂起原事务
- NESTED:嵌套事务,可独立回滚
8. 事务失效的常见原因 - 方法为private/final
- 异常被catch未抛出
- 数据库引擎不支持事务(如MyISAM)
五、Spring MVC机制
9. DispatcherServlet的工作流程
- 接收请求 → 2. 处理器映射(HandlerMapping)定位控制器 → 3. 适配器(HandlerAdapter)调用方法 → 4. 视图解析(ViewResolver)返回响应
10. @Controller与@RestController的区别@RestController=@Controller+@ResponseBody,直接返回JSON/XML而非视图名。
六、数据访问
11. JdbcTemplate与JPA/Hibernate的对比
- JdbcTemplate:低级API,需手动处理结果集
- JPA:ORM框架,通过实体类映射数据库
示例:
12. @Transactional的隔离级别设置// JdbcTemplate查询List<User> users = jdbcTemplate.query("SELECT * FROM users", new UserRowMapper());
@Transactional(isolation = Isolation.READ_COMMITTED)public void updateData() {}
七、高级特性
13. Spring Boot自动配置原理
通过@EnableAutoConfiguration导入AutoConfigurationImportSelector,扫描META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中的配置类,结合条件注解(如@ConditionalOnClass)动态生效。
14. 如何自定义Starter?
- 创建
spring.factories文件指定自动配置类 - 使用
@Configuration定义Bean - 发布时添加
-spring-boot-starter后缀
八、测试与集成
15. Spring Test的Mock机制
使用@MockBean替换真实Bean:
@MockBeanprivate UserRepository repository;@Testpublic void testService() {when(repository.findById(1L)).thenReturn(new User());// 测试逻辑}
16. 集成测试的数据库初始化策略
@Sql(scripts = "classpath:init.sql"):执行SQL脚本@DataJpaTest:仅加载JPA相关组件
九、性能优化
17. 减少Spring启动时间的技巧
- 排除不必要的自动配置(
@SpringBootApplication(exclude = {...})) - 使用懒加载(
@Lazy) - 升级到最新版本优化类加载
18. 监控Spring应用的方案
- Actuator端点(
/health,/metrics) - Micrometer集成Prometheus/Grafana
- 自定义
HealthIndicator:@Componentpublic class CustomHealthIndicator implements HealthIndicator {@Overridepublic Health health() {return checkExternalService() ? Health.up() : Health.down();}}
总结与建议
本文系统梳理了Spring面试中的高频考点,建议开发者:
- 结合源码理解IoC/AOP底层机制
- 通过实际项目掌握事务与MVC的配置
- 关注Spring Boot 3.x的GraalVM原生镜像支持等新特性
掌握这些核心知识后,可进一步深入Spring Security、Batch等模块,构建更完整的技术栈。

发表评论
登录后可评论,请前往 登录 或 注册