logo

Spring面试18问:从基础到进阶的全面解析

作者:c4t2025.09.25 14:51浏览量:1

简介:本文围绕Spring框架面试中常见的18个核心问题展开,涵盖IoC/AOP原理、事务管理、MVC机制等关键技术点,结合代码示例与场景分析,为开发者提供系统化的复习指南。

一、Spring核心概念

1. Spring框架的核心特性是什么?
Spring的核心是IoC(控制反转)和AOP(面向切面编程)。IoC通过容器管理Bean生命周期,解耦组件依赖;AOP通过动态代理实现横切关注点(如日志、事务)的模块化。例如:

  1. // 依赖注入示例
  2. @Service
  3. public class UserService {
  4. @Autowired
  5. private UserRepository repository; // 由容器自动注入
  6. }

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代理:通过继承,适用于无接口类
    配置示例:
    1. <aop:aspectj-autoproxy proxy-target-class="true"/> <!-- 强制使用CGLIB -->
    6. 切点表达式如何编写?
    使用AspectJ表达式,例如:
    1. @Pointcut("execution(* com.example.service.*.*(..))")
    2. public void serviceMethods() {}

四、事务管理

7. @Transactional的传播行为有哪些?

  • REQUIRED(默认):加入当前事务
  • REQUIRES_NEW:新建事务,挂起原事务
  • NESTED:嵌套事务,可独立回滚
    8. 事务失效的常见原因
  • 方法为private/final
  • 异常被catch未抛出
  • 数据库引擎不支持事务(如MyISAM)

五、Spring MVC机制

9. DispatcherServlet的工作流程

  1. 接收请求 → 2. 处理器映射(HandlerMapping)定位控制器 → 3. 适配器(HandlerAdapter)调用方法 → 4. 视图解析(ViewResolver)返回响应
    10. @Controller@RestController的区别
    @RestController = @Controller + @ResponseBody,直接返回JSON/XML而非视图名。

六、数据访问

11. JdbcTemplate与JPA/Hibernate的对比

  • JdbcTemplate:低级API,需手动处理结果集
  • JPA:ORM框架,通过实体类映射数据库
    示例:
    1. // JdbcTemplate查询
    2. List<User> users = jdbcTemplate.query("SELECT * FROM users", new UserRowMapper());
    12. @Transactional的隔离级别设置
    1. @Transactional(isolation = Isolation.READ_COMMITTED)
    2. public void updateData() {}

七、高级特性

13. Spring Boot自动配置原理
通过@EnableAutoConfiguration导入AutoConfigurationImportSelector,扫描META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中的配置类,结合条件注解(如@ConditionalOnClass)动态生效。

14. 如何自定义Starter?

  1. 创建spring.factories文件指定自动配置类
  2. 使用@Configuration定义Bean
  3. 发布时添加-spring-boot-starter后缀

八、测试与集成

15. Spring Test的Mock机制
使用@MockBean替换真实Bean:

  1. @MockBean
  2. private UserRepository repository;
  3. @Test
  4. public void testService() {
  5. when(repository.findById(1L)).thenReturn(new User());
  6. // 测试逻辑
  7. }

16. 集成测试的数据库初始化策略

  • @Sql(scripts = "classpath:init.sql"):执行SQL脚本
  • @DataJpaTest:仅加载JPA相关组件

九、性能优化

17. 减少Spring启动时间的技巧

  • 排除不必要的自动配置(@SpringBootApplication(exclude = {...})
  • 使用懒加载(@Lazy
  • 升级到最新版本优化类加载

18. 监控Spring应用的方案

  • Actuator端点(/health, /metrics
  • Micrometer集成Prometheus/Grafana
  • 自定义HealthIndicator
    1. @Component
    2. public class CustomHealthIndicator implements HealthIndicator {
    3. @Override
    4. public Health health() {
    5. return checkExternalService() ? Health.up() : Health.down();
    6. }
    7. }

总结与建议

本文系统梳理了Spring面试中的高频考点,建议开发者

  1. 结合源码理解IoC/AOP底层机制
  2. 通过实际项目掌握事务与MVC的配置
  3. 关注Spring Boot 3.x的GraalVM原生镜像支持等新特性
    掌握这些核心知识后,可进一步深入Spring Security、Batch等模块,构建更完整的技术栈。

相关文章推荐

发表评论

活动