50 道 经典 Spring 面试题

📅 发布时间:2026/7/4 9:38:17 👁️ 浏览次数:
50 道 经典 Spring 面试题
第一部分Spring基础 核心概念1. 什么是Spring框架Spring是一个轻量级的开源框架是为了解决企业级应用开发的复杂性而创建的。其核心是控制反转IoC和面向切面编程AOP。它的主要目标是简化Java开发通过POJO简单的Java对象为基础的编程模型来促进良好的编程习惯。2. Spring框架有哪些核心模块Spring框架由多个模块组成主要包含Spring Core核心容器提供IoC和DI功能。Spring AOP面向切面编程的实现。Spring Web MVC构建Web应用程序的MVC框架。Spring DAO/ JDBC对JDBC的抽象封装简化数据访问异常处理。Spring ORM对Hibernate、JPA等ORM框架的集成。Spring Context企业级服务支持如JNDI、EJB等。3. 什么是控制反转IoC和依赖注入DIIoC控制反转是一种设计思想指的是将传统上由程序代码直接操控的对象控制权交给容器来实现。即不再由调用者创建被调用者而是由Spring容器创建并管理对象。DI依赖注入是IoC的具体实现方式。在程序运行时由Spring容器动态地将依赖关系注入到组件中。4. IoC容器有哪些优点解耦将类之间的依赖关系从代码中剥离由容器管理降低耦合度。可测试性方便进行单元测试如Mock对象。实例管理自动管理对象的生命周期和作用域。提高复用性和灵活性。第二部分IoC容器 Bean详解5. BeanFactory 和 ApplicationContext 有什么区别BeanFactory是Spring最底层的接口提供了最基本的IoC功能。采用懒加载机制getBean时才初始化Bean。ApplicationContext是BeanFactory的子接口提供了更多企业级功能如解析配置文件、事件发布、国际化支持等。采用预加载机制创建上下文时就初始化大部分单例Bean。6. Spring Bean 的生命周期是怎样的Spring Bean的生命周期可以简单概括为四个主要阶段但在源码层面较为复杂核心流程如下实例化通过反射创建Bean的实例。属性赋值为Bean的属性进行注入依赖注入。初始化调用各种Aware接口的回调如BeanNameAware。执行BeanPostProcessor的前置处理。执行InitializingBean的afterPropertiesSet方法以及自定义的init-method。执行BeanPostProcessor的后置处理这里是AOP动态代理生成的关键点。销毁容器关闭时调用DisposableBean的destroy方法和自定义的destroy-method。7. Spring Bean 的作用域有哪些singleton默认每个Spring IoC容器中只有一个Bean实例。prototype每次获取都会创建一个新的Bean实例。request每次HTTP请求创建一个Bean仅限Web应用。session每个HTTP Session创建一个Bean仅限Web应用。application/ global-session每个ServletContext或全局Session创建一个Bean。8. 单例Bean是线程安全的吗Spring框架中的单例Bean不是线程安全的。因为单例Bean是全局共享的如果Bean中定义了可变的成员变量在多线程并发修改时就会出现线程安全问题。解决方案尽量设计无状态的Bean大部分Service和DAO都是无状态的只有方法逻辑没有成员变量。使用ThreadLocal来保存可变状态为每个线程提供独立的变量副本。9. 什么是循环依赖Spring是如何解决的定义循环依赖是指在对象创建过程中A依赖BB依赖A形成闭环。解决方案Spring通过三级缓存解决了singleton setter注入的循环依赖。一级缓存singletonObjects存放已经初始化完成的成品Bean。二级缓存earlySingletonObjects存放提前暴露的、未完全初始化的半成品Bean。三级缓存singletonFactories存放ObjectFactory用于生成对象的早期引用主要目的是为了解决AOP代理问题。无法解决的场景构造器注入的循环依赖因为此时对象还未实例化无法提前暴露引用。prototype作用域的Bean因为Spring不缓存prototype类型的Bean。10. 为什么要使用三级缓存二级不够吗二级缓存也可以解决循环依赖但引入三级缓存的核心原因是为了处理AOP代理。如果Bean需要被AOP增强那么在实例化后直接返回原始对象后续就无法生成代理对象了。三级缓存中存的ObjectFactory可以在需要早期引用时调用其getEarlyBeanReference方法提前生成代理对象确保注入的依赖是最终的代理对象。11. Autowired 和 Resource 的区别是什么Autowired由Spring提供。默认按照byType类型装配。如果类型匹配到多个Bean则配合Qualifier按byName装配。Resource由Java标准JSR-250提供。默认按照byName名称装配。如果找不到名称匹配的Bean则回退为byType进行装配。12. 将一个类声明为Bean的注解有哪些Component通用的注解标识该类为Spring组件。Repository标识数据访问层DAO。Service标识业务逻辑层Service。Controller标识表示层Web层。13. Component 和 Bean 的区别是什么作用对象不同Component作用于类通过类路径扫描自动装配Bean作用于方法通常用于将第三方库中的类实例化为Bean。创建方式不同Component是Spring自动发现并创建Bean是程序员手动编写方法逻辑显式创建并返回实例。⚔️第三部分面向切面编程AOP14. 什么是AOP它的应用场景有哪些AOP面向切面编程通过预编译方式和运行期动态代理实现程序功能的统一维护。它可以将与业务无关但多个模块公用的逻辑如日志记录、性能统计、安全控制、事务处理封装起来减少代码重复降低耦合度。15. Spring AOP 的底层实现原理是什么Spring AOP是基于动态代理实现的。JDK动态代理如果目标对象实现了接口Spring会默认使用JDK动态代理。它通过反射生成一个实现同样接口的代理类。CGLIB动态代理如果目标对象没有实现接口Spring会使用CGLIB库。CGLIB通过继承目标类生成一个子类作为代理。16. JDK动态代理和CGLIB动态代理的区别JDK动态代理只能代理实现了接口的类通过反射机制处理。CGLIB动态代理可以代理没有接口的类通过生成目标类的子类来实现。因此final修饰的方法或类无法被CGLIB代理。17. AOP中的关键术语Joinpoint, Pointcut, Advice, Aspect连接点Joinpoint程序执行过程中的某个点如方法调用、异常抛出。在Spring AOP中连接点特指方法的执行。切点Pointcut匹配连接点的表达式用于定位需要在哪些连接点上执行通知。通知Advice在特定切点上执行的具体增强逻辑如Before, After, Around。切面Aspect切点Pointcut和通知Advice的组合共同定义了“在哪里”和“做什么”。18. 通知Advice的类型有哪些Before在方法执行前执行。After在方法执行后执行无论是否抛出异常。AfterReturning在方法成功返回后执行。AfterThrowing在方法抛出异常后执行。Around环绕通知可以在方法调用前后自定义行为甚至可以控制方法是否执行。第四部分Spring事务管理19. Spring支持的事务管理方式有哪些编程式事务通过编写代码如TransactionTemplate手动管理事务的提交和回滚。代码侵入性强但粒度更细。声明式事务基于AOP通过Transactional注解或XML配置来管理事务。这种方式更常用代码侵入性低。20. Spring事务的传播行为有哪些事务传播行为定义了事务方法在被另一个事务方法调用时事务该如何传播。常用的是前三种REQUIRED默认支持当前事务如果不存在则创建新事务。REQUIRES_NEW创建新事务如果当前存在事务则挂起当前事务。NESTED如果当前存在事务则在嵌套事务内执行依赖底层JDBC的savepoint。SUPPORTS支持当前事务如果不存在则以非事务方式执行。NOT_SUPPORTED以非事务方式执行如果存在当前事务则挂起。MANDATORY强制要求当前存在事务否则抛出异常。NEVER必须以非事务方式执行如果存在事务则抛出异常。21. Spring事务的隔离级别有哪些隔离级别解决并发事务导致的数据不一致问题脏读、不可重复读、幻读通常使用数据库默认的隔离级别DEFAULT使用底层数据库的默认隔离级别。READ_UNCOMMITTED读未提交。READ_COMMITTED读已提交。REPEATABLE_READ可重复读。SERIALIZABLE串行化。22. 什么时候 Transactional 注解会失效这是高频考点常见失效场景如下异常被捕获方法内部用try-catch捕获了异常没有抛出导致Spring无法感知异常而回滚。抛出检查时异常默认只回滚RuntimeException和Error抛出非运行时异常如Exception不回滚。需通过rollbackFor Exception.class指定。非public方法Spring默认只对public方法进行代理增强。方法内部自调用同一个类中的方法A调用方法B即使B加了Transactional由于没有经过代理对象事务也会失效。数据库引擎不支持事务如MySQL的MyISAM引擎。第五部分Spring MVC23. Spring MVC 的执行流程是怎样的用户发送请求被前端控制器DispatcherServlet拦截。DispatcherServlet调用处理器映射器HandlerMapping根据请求URL找到具体的处理器Handler即Controller。DispatcherServlet根据获取到的Handler选择合适的处理器适配器HandlerAdapter。HandlerAdapter调用具体的Controller执行请求逻辑并返回ModelAndView对象。DispatcherServlet将ModelAndView交给视图解析器ViewResolver解析成真正的视图View。DispatcherServlet对视图进行渲染将Model数据填充到View中。DispatcherServlet将最终的视图响应给用户。24. 什么是DispatcherServletDispatcherServlet是Spring MVC的前端控制器。它是一个Servlet负责接收所有HTTP请求并将其委派给相应的组件如控制器、视图解析器进行处理从而实现了请求处理流程的统一控制。25. 如果在Controller中想接收JSON数据应该用什么注解使用RequestBody注解。它会将HTTP请求体中的JSON字符串绑定到对应的Java对象上。26. 如果想返回JSON数据应该在类或方法上加什么注解ResponseBody加在方法上表示该方法的返回值直接写入HTTP响应体中而不是解析为视图路径。RestController组合注解等同于ControllerResponseBody现在开发RESTful API时最常用。27. RequestMapping 有什么用它是一个映射注解用于将HTTP请求映射到控制器的处理方法上。可以在类级别定义根路径和方法级别定义具体子路径使用。第六部分Spring Boot 核心28. Spring Boot 的核心注解 SpringBootApplication 是什么它是一个组合注解包含以下三个主要注解SpringBootConfiguration本质上是一个Configuration表示该类是一个配置类。EnableAutoConfiguration启动自动配置让Spring Boot根据类路径中的依赖自动配置Bean。ComponentScan启用组件扫描自动扫描当前包及其子包下的Component等注解。29. Spring Boot 的自动配置原理是什么Spring Boot在启动时会通过EnableAutoConfiguration注解从类路径下的META-INF/spring.factoriesSpring Boot 2.x或META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.importsSpring Boot 3.x文件中加载一大批预定义的自动配置类XxxAutoConfiguration。这些配置类中大量使用了条件注解如ConditionalOnClassConditionalOnMissingBean等只有当满足特定条件时比如classpath下有某个类或用户没有自定义某个Bean该自动配置才会生效。30. Spring Boot Starter 是什么Starter是一组方便的依赖描述符。它聚合了特定功能所需的所有依赖包括传递依赖开发者只需要在项目中引入这一个starter就可以获得该功能的所有依赖和自动配置支持无需再手动添加大量jar包。31. Spring Boot 中的 application.properties 和 application.yml 有什么区别两者都是Spring Boot的配置文件只是格式不同。properties使用点分键值对的形式结构简单。YAML/YML使用缩进表示层级关系结构清晰可读性高特别适合表示列表和Map等数据结构。32. Spring Boot Actuator 有什么作用Actuator 是 Spring Boot 提供的用于对应用系统进行监控和管理的功能模块。通过HTTP端点或JMX可以查看应用的运行状态、健康情况、指标Metrics、环境属性、日志信息等。33. Spring Boot 中如何实现异步方法在启动类或配置类上添加EnableAsync注解开启异步支持。在需要异步执行的方法上添加Async注解。Spring会将该方法的执行提交到线程池中调用者不会阻塞等待结果。34. Spring Boot 中如何定制内嵌的Servlet容器如Tomcat可以通过在配置文件中配置server相关的属性如server.portserver.servlet.context-path等或者通过注册WebServerFactoryCustomizer组件来实现更细粒度的控制。☁️第七部分Spring Cloud 微服务35. 什么是微服务为什么使用Spring Cloud微服务是一种架构风格它将一个大型复杂应用拆分成一组小型的、独立的服务每个服务围绕业务能力构建可独立开发、部署和扩展。Spring Cloud 是基于 Spring Boot 的微服务解决方案它为开发者提供了在分布式系统中快速构建一些常见模式如配置管理、服务发现、断路器、智能路由、微代理等的工具。36. Spring Cloud 主要有哪些核心组件服务注册与发现Netflix Eureka / Alibaba Nacos。服务调用OpenFeign声明式HTTP客户端。负载均衡Spring Cloud LoadBalancer。服务熔断与降级Resilience4J / Alibaba Sentinel。API网关Spring Cloud Gateway。配置中心Spring Cloud Config / Alibaba Nacos。37. 什么是服务熔断和降级熔断当某个服务故障或响应超时为了防止整个系统出现雪崩暂时切断对该服务的调用直接返回错误。类似于电路跳闸。降级当服务器压力剧增时根据业务策略放弃一些非核心功能或者提供一种备选的、简化的返回结果以保证核心功能的可用性。38. Spring Cloud Gateway 的作用是什么Gateway是Spring Cloud官方推出的API网关。它作为系统的统一入口负责将所有客户端的请求路由到后端的微服务。它还可以实现统一认证、日志、限流、跨域处理等功能。39. OpenFeign 的工作原理是什么OpenFeign 是一个声明式的HTTP客户端。开发者只需定义一个Java接口并在接口上添加FeignClient注解OpenFeign就会在运行时通过动态代理生成接口的实现类。它会根据注解中的信息服务名、请求路径等自动构建HTTP请求并调用远程服务同时集成了负载均衡的功能。40. 分布式系统中什么是分布式事务分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。简单的数据库本地事务无法解决跨服务的操作一致性问题。常见的解决方案有两阶段提交2PC、TCCTry-Confirm-Cancel模式、可靠消息最终一致性、Seata框架等。第八部分设计模式 其他41. Spring框架中用了哪些设计模式工厂模式BeanFactory和ApplicationContext用于创建Bean实例。单例模式Spring中Bean的默认作用域就是单例。代理模式AOP的实现核心。模板方法模式JdbcTemplateRestTemplate等Template类。观察者模式Spring事件驱动模型ApplicationEventApplicationListener。适配器模式Spring MVC中的HandlerAdapter用于适配不同类型的Controller。42. 什么是Bean的自动装配有哪些模式自动装配是指Spring容器在不使用constructor-arg和property标签的情况下自动建立Bean之间的依赖引用关系。模式有nobyNamebyTypeconstructor。43. Qualifier 注解的作用是什么当使用Autowired自动装配时如果存在多个类型相同的BeanSpring就会不知道注入哪个。此时使用Qualifier(beanName)配合Autowired可以根据Bean的名称来指定注入哪个具体的实现类。44. Primary 注解的作用是什么当有多个相同类型的Bean时给其中一个Bean标记Primary它会成为自动装配时的首选Bean。如果同时使用了Qualifier则Qualifier优先级更高。45. Spring 的事件机制是什么Spring 的事件Application Event为Bean与Bean之间提供了消息通信的支持。它遵循观察者模式。当一个Bean发布事件ApplicationEvent后所有对该事件感兴趣的监听者ApplicationListener都会收到通知并处理。46. Spring 如何管理数据库连接池Spring本身不提供连接池实现但它可以集成第三方连接池如HikariCP、Druid、C3P0。在Spring Boot中默认使用HikariCP作为数据源只需在配置文件中配置spring.datasource相关的连接信息即可。47. 什么是JdbcTemplateJdbcTemplate是Spring对JDBC的封装模板类。它简化了JDBC的使用步骤如获取连接、创建语句、释放资源使开发者只需关注SQL语句和结果集的提取从而大大减少了样板代码。48. Spring Boot 中如何读取配置文件中的自定义属性使用Value(${property.name})注解注入单个属性。使用ConfigurationProperties(prefix my)绑定一个属性前缀将一组属性映射到一个Java Bean上。49. Spring Boot 支持哪些内嵌的Servlet容器Spring Boot默认支持内嵌的Tomcat默认、Jetty和Undertow。可以通过修改依赖排除Tomcat引入其他容器的starter来切换。50. Spring Data JPA 和 Hibernate 的关系是什么JPAJava Persistence API是一种规范/接口定义了对象关系映射的API标准。Hibernate是JPA规范的一种实现。Spring Data JPA在Hibernate核心功能的基础上又封装了一层提供了更便捷的Repository层抽象进一步简化了数据访问操作。