面试官Spring63问,抗住了马上高薪,失败了工厂拧螺丝:2万字详解 第一部分Spring 核心基础问题 1-151. 什么是 Spring 框架Spring 是一个轻量级的开源 Java 开发框架核心目标是解决企业级应用开发的复杂性。它并不是某个单一功能组件而是一套完整的生态最核心的是容器管理、依赖注入和面向切面编程能力。面试时要突出三点一是简化了 Java EE 开发二是通过 IoC 降低了对象之间的耦合三是目前已经发展成 Spring Boot、Spring Cloud 等一整套生态体系。2. Spring 的核心特性有哪些IoC 容器管理对象的创建、依赖注入和生命周期。AOP面向切面编程将日志、事务、权限等横切关注点与业务逻辑分离。声明式事务通过注解或 XML 配置进行事务管理。Spring MVC提供 Web 层的模型、视图、控制器支持。生态整合能力方便整合 MyBatis、Redis、消息队列等主流中间件。3. 什么是 IoC 和 DI它们有什么区别IoC 是控制反转是一种设计思想。传统开发中对象由程序自己通过new来创建而 IoC 把对象创建和管理的控制权交给 Spring 容器。DI 是依赖注入是 IoC 的具体实现方式。Spring 容器在创建对象时会把它依赖的其他对象自动注入到该对象中。两者的关系可以概括为IoC 是思想DI 是手段。4. IoC 容器有哪几种BeanFactory 和 ApplicationContext 有什么区别BeanFactorySpring 最底层的容器接口提供基础的 Bean 获取和管理能力延迟加载。ApplicationContextBeanFactory 的子接口扩展了国际化、事件发布、资源加载、AOP 集成等能力默认在容器启动时预加载所有单例 Bean。开发中几乎都使用ApplicationContext。5. Spring Bean 的作用域有哪些singleton默认作用域一个容器中一个 Bean 定义只对应一个实例。prototype每次获取都会创建新的实例。request同一个 HTTP 请求内共享一个 Bean 实例。session同一个 HTTP Session 内共享一个 Bean 实例。application同一个 ServletContext 内共享一个 Bean 实例。websocket同一个 WebSocket 会话内共享一个实例。prototype类型的 Bean 不会由 Spring 完整管理销毁过程容易造成资源泄漏。6. Spring Bean 的生命周期是怎样的实例化容器通过构造方法或工厂方法创建 Bean 实例。属性填充根据配置进行依赖注入。Aware 回调BeanNameAware、BeanFactoryAware、ApplicationContextAware。BeanPostProcessor前置处理postProcessBeforeInitialization。初始化InitializingBean.afterPropertiesSet或init-method。BeanPostProcessor后置处理postProcessAfterInitializationAOP 代理通常在这一步生成。使用。销毁DisposableBean或destroy-method。7. Spring 支持哪些 Bean 的注入方式构造方法注入通过构造器传入依赖适合强依赖场景推荐。Setter 注入通过 setter 方法设置依赖适合可选依赖。字段注入直接在字段上使用Autowired或Resource代码简洁但不利于单元测试。推荐构造方法注入配合final字段保证依赖不可变。8. 什么是循环依赖Spring 如何解决循环依赖循环依赖指两个或多个 Bean 互相依赖。Spring 主要依赖三级缓存来解决单例 Bean 的循环依赖一级缓存 singletonObjects存放完全初始化完成的单例 Bean。二级缓存 earlySingletonObjects存放提前暴露的早期 Bean 引用。三级缓存 singletonFactories存放 Bean 的ObjectFactory。需要注意构造方法注入导致的循环依赖Spring 无法解决。prototype 作用域的 Bean 不做缓存循环依赖也无法解决。Spring Boot 2.6 之后默认禁止循环依赖。9. Spring 中 Autowired 和 Resource 有什么区别来源不同Autowired是 Spring 提供的Resource是 Java 标准注解。注入逻辑不同Autowired默认先按类型注入同类型有多个再按名称匹配Resource默认先按名称匹配找不到时再按类型匹配。属性不同Autowired可配合QualifierResource有name和type属性。10. 什么是 Bean 自动装配有哪些方式byType根据类型匹配。byName根据 Bean 名称匹配。constructor通过构造方法参数类型匹配。注解自动装配Autowired、Resource、Inject。如果 byType 匹配到多个 Bean可以通过Primary或Qualifier指定。11. Spring 的单例 Bean 线程安全吗Spring 容器中的单例 Bean 本身并不保证线程安全。线程安全的关键在于 Bean 中是否包含可变状态无状态 Bean 是线程安全的。包含可变类成员变量且方法会修改这些变量时就可能出现线程安全问题。解决方案设计成无状态、改成 prototype、使用 ThreadLocal 等。12. Spring 框架中用了哪些设计模式工厂模式BeanFactory、ApplicationContext。单例模式默认作用域 singleton。代理模式AOP 通过 JDK 动态代理或 CGLIB。模板方法模式JdbcTemplate、RestTemplate。观察者模式ApplicationEvent事件发布与监听。适配器模式Spring MVC 中的HandlerAdapter。装饰器模式BeanWrapper对 Bean 属性访问的增强。13. 什么是 FactoryBean 和 BeanFactoryBeanFactorySpring 的 IoC 容器根接口主要方法是getBean。FactoryBean一种特殊的 Bean通过getObject方法返回真正要交给容器管理的对象。beanName拿到的是 FactoryBean 本身beanName拿到的是getObject返回的对象。14. Component 和 Bean 有什么区别作用位置不同Component注解在类上配合组件扫描自动注册Bean注解在Configuration类的方法上方法返回值会被注册成 Bean。适用场景不同项目自己的类适合用Component第三方库或需要精细控制初始化逻辑的对象适合用Bean。15. Spring 的 Java 配置方式和 XML 配置方式有什么区别XML 配置早期主流配置集中但维护成本较高。Java 配置使用Configuration和Bean类型安全、支持 IDE 跳转和重构。注解/组件扫描使用Component、Service等注解配合扫描。第二部分Spring AOP问题 16-2516. 什么是 AOPAOP 即面向切面编程是 OOP 的一种补充。它把日志、事务、权限、缓存等横切逻辑集中抽取到「切面」中统一处理减少代码重复降低模块耦合。17. AOP 有哪些核心概念切面 Aspect封装横切逻辑的模块。连接点 JoinPoint程序执行过程中可以增强的点。切入点 Pointcut一组连接点的集合。通知 Advice切面在某个连接点上执行的具体逻辑。目标对象 Target被代理的原始对象。织入 Weaving把通知应用到目标对象上生成代理对象的过程。18. Spring AOP 和 AspectJ 有什么区别实现方式不同Spring AOP 基于运行时动态代理AspectJ 支持编译期、编译后和类加载期织入。能力范围不同Spring AOP 主要增强方法级别AspectJ 可以增强字段、构造器等。依赖环境不同Spring AOP 使用简单AspectJ 功能更强但配置成本更高。性能差异AspectJ 静态织入通常性能更好。19. AOP 有哪些通知类型前置通知 Before后置通知 AfterReturning异常通知 AfterThrowing最终通知 After环绕通知 Around环绕通知最强大可以决定是否继续执行目标方法。20. JDK 动态代理和 CGLIB 有什么区别代理机制不同JDK 动态代理基于接口CGLIB 基于继承。适用对象不同JDK 动态代理要求目标对象必须实现接口CGLIB 可以代理没有实现接口的普通类。方法调用原理不同JDK 通过InvocationHandler.invokeCGLIB 通过MethodInterceptor。性能差异JDK 生成代理类较快但底层使用反射CGLIB 生成成本更高但执行通常更快。Spring Boot 2.x 以后通常默认使用 CGLIB。21. Spring AOP 的实现原理是什么Spring AOP 的核心思路是「运行时生成代理对象用代理对象包装目标对象」。调用方拿到的引用实际上是代理类因此方法调用会被代理拦截在合适时机执行通知逻辑。javaAspect Component public class LogAspect { Before(execution(* com.example.service..*(..))) public void before(JoinPoint joinPoint) { System.out.println(before: joinPoint.getSignature().getName()); } }22. 为什么 Spring AOP 默认使用 JDK 动态代理JDK 动态代理是 Java 原生能力不依赖额外字节码库使用上更轻量同时基于接口的代理也更符合面向接口编程的设计理念。23. 常见的切入点表达式有哪些写法execution最常用精确匹配方法签名。within匹配某个类型内的所有方法。annotation匹配标注了指定注解的方法。bean匹配指定 Bean 名称。args匹配方法参数类型。this和target分别匹配代理对象类型和目标对象类型。24. 多个切面的执行顺序如何控制通过Order注解或实现Ordered接口来指定顺序。值越小优先级越高越先执行。javaComponent Aspect Order(1) public class FirstAspect { Before(execution(* com.example.service..*(..))) public void before() { System.out.println(first aspect before); } }25. Spring AOP 有哪些常见应用场景日志记录。声明式事务。权限校验。缓存处理。限流和熔断。审计追踪。第三部分Spring 事务管理问题 26-3526. 什么是事务事务的四大特性是什么事务是一组操作组成的逻辑单元这些操作要么全部成功要么全部失败回滚。四大特性即 ACID原子性 Atomicity一致性 Consistency隔离性 Isolation持久性 Durability27. 事务隔离级别有哪些读未提交 READ_UNCOMMITTED可能出现脏读。读已提交 READ_COMMITTED解决脏读但可能出现不可重复读。可重复读 REPEATABLE_READ解决脏读和不可重复读但仍可能出现幻读。串行化 SERIALIZABLE隔离级别最高但并发性能最差。MySQL InnoDB 默认是可重复读Oracle 和 PostgreSQL 默认是读已提交。28. 事务传播行为有哪些重点讲 REQUIRED、REQUIRES_NEW 和 NESTED 的区别。REQUIRED默认。如果当前存在事务就加入不存在就新建。REQUIRES_NEW总是新建一个事务并挂起当前事务。内外事务互不影响。NESTED如果当前存在事务则创建嵌套事务内层回滚可以回到保存点但外层回滚会让嵌套事务一起回滚。SUPPORTS当前有事务就加入没有就以非事务方式执行。NOT_SUPPORTED以非事务方式执行并挂起当前事务。MANDATORY必须在已有事务中执行否则抛出异常。NEVER必须在非事务环境下执行否则抛出异常。29. Spring 事务管理有哪些方式编程式事务通过TransactionTemplate或PlatformTransactionManager手动控制。声明式事务通过Transactional注解或 XML 配置声明事务规则底层由 AOP 代理实现。30. Transactional 在哪些场景下会失效方法被同类内部调用。方法不是public。异常被方法内部 catch 吞掉。抛出的异常类型未触发回滚。类没有被 Spring 管理。数据库引擎不支持事务。事务管理器配置错误。31. Transactional 注解应该用在类上还是方法上既可以标注在类上也可以标注在方法上。方法上的配置优先级高于类上配置。标注在类上相当于对类中所有public方法统一开启事务。32. Transactional 的 rollbackFor 属性有什么作用rollbackFor用来指定哪些异常发生时要回滚事务。Spring 默认只对RuntimeException和Error进行回滚对受检异常不回滚。javaTransactional(rollbackFor Exception.class) public void createOrder(Order order) throws Exception { orderService.save(order); stockService.decrease(order.getSkuId()); }33. Spring 事务的实现原理是什么Spring 事务本质上是 AOP 的一个典型应用。核心组件包括TransactionInterceptor事务拦截器。PlatformTransactionManager事务管理器。TransactionAttribute从Transactional注解解析出的事务属性。执行流程代理对象拦截目标方法读取事务属性决定是否开启事务执行目标方法执行成功则提交出现回滚异常则回滚。34. 如何配置事务的超时时间、只读属性和回滚规则通过Transactional的属性配置timeout事务超时时间单位是秒。readOnly设置为true表示只读事务。isolation事务隔离级别。propagation事务传播行为。rollbackFor和noRollbackFor控制异常回滚规则。javaTransactional(readOnly true, timeout 30) public ListOrder listOrders(Long userId) { return orderMapper.selectByUserId(userId); }35. Spring 本地事务能解决分布式事务问题吗不能。Spring 的本地事务通常建立在单个 DataSource 或单个数据库事务之上只能保证同一个数据库实例内的一致性。跨服务、跨数据库的分布式事务必须引入 XA、TCC、SAGA 或 Seata 等方案。第四部分Spring MVC问题 36-4536. Spring MVC 的执行流程是怎样的请求首先到达DispatcherServlet。DispatcherServlet调用HandlerMapping找到处理请求的 Controller。DispatcherServlet通过HandlerAdapter调用对应的 Controller 方法。Controller 执行完业务逻辑后返回ModelAndView或数据对象。DispatcherServlet根据返回结果进行视图解析或交给消息转换器生成 JSON。最终将响应返回给客户端。37. DispatcherServlet 的作用是什么DispatcherServlet是 Spring MVC 的核心前端控制器负责接收所有进入应用的 HTTP 请求并进行统一分发。它本身不处理具体业务而是通过调度HandlerMapping、HandlerAdapter、ViewResolver等组件来完成请求处理。38. Controller 和 RestController 有什么区别Controller用于声明一个类为 Spring MVC 的控制器方法默认返回视图名称。RestController是Controller和ResponseBody的组合注解方法返回值会直接写入 HTTP 响应体。39. RequestMapping 和 GetMapping、PostMapping 有什么区别RequestMapping是通用请求映射注解可以通过method属性指定 GET、POST、PUT、DELETE 等请求方法。GetMapping、PostMapping等是RequestMapping的语义化简写。javaRequestMapping(value /orders, method RequestMethod.POST) public void create() { } PostMapping(/orders) public void createOrder() { }40. Spring MVC 有哪些常用注解Controller/RestController声明控制器。RequestMapping处理请求地址映射。GetMapping/PostMapping/PutMapping/DeleteMapping按 HTTP 方法映射请求。RequestParam绑定查询参数。PathVariable绑定路径变量。RequestBody绑定请求体。ResponseBody直接返回数据。ModelAttribute绑定表单对象。ExceptionHandler处理异常。41. RequestParam 和 PathVariable 有什么区别RequestParam用于获取查询参数或表单参数例如/users?id1。PathVariable用于获取 URL 路径中的变量例如/users/1。42. RequestBody 和 ResponseBody 的作用是什么RequestBody把 HTTP 请求体反序列化为 Java 对象常配合PostMapping使用。ResponseBody把 Java 对象序列化为 HTTP 响应体通常由 Jackson 完成 JSON 序列化。43. Spring MVC 如何处理异常通过HandlerExceptionResolver统一处理异常。常见实现包括ExceptionHandlerExceptionResolver处理ExceptionHandler注解。ResponseStatusExceptionResolver处理ResponseStatus注解。DefaultHandlerExceptionResolver处理 Spring 内置异常。推荐使用RestControllerAdvice加ExceptionHandler做全局异常处理。44. 拦截器和过滤器有什么区别对比项过滤器 Filter拦截器 HandlerInterceptor规范来源Servlet 规范Spring MVC执行位置Servlet 容器中DispatcherServlet 内部能否拿到 Handler不能能拦截范围所有请求Controller 请求45. Spring MVC 如何实现参数校验通过Valid或Validated注解触发校验。校验失败会抛出MethodArgumentNotValidException或BindException通常由全局异常处理器统一处理。第五部分Spring Boot问题 46-5546. Spring Boot 是什么它解决了什么问题Spring Boot 是构建在 Spring 之上的快速开发框架核心目标是简化 Spring 应用的配置和部署。它通过自动配置、starter 依赖、内嵌容器让开发者可以快速构建独立运行的应用。47. Spring Boot 的核心特性有哪些自动配置。starter 依赖。内嵌容器。可执行 Jar。Actuator 监控。外部化配置。48. Spring Boot 自动配置的原理是什么核心入口是EnableAutoConfiguration。Spring Boot 会从META-INF/spring.factories或AutoConfiguration.imports中读取自动配置类再根据条件注解决定是否生效。49. Spring Boot 中的条件注解有哪些ConditionalOnClassConditionalOnMissingBeanConditionalOnPropertyConditionalOnWebApplicationConditionalOnBean50. Spring Boot 的 starter 是什么starter 是一组依赖的集合把某个功能所需的依赖和自动配置打包在一起。例如引入spring-boot-starter-web就会自动带来 Spring MVC、内嵌 Tomcat 和 JSON 序列化。51. Spring Boot 如何实现内嵌容器Spring Boot 默认内嵌 Tomcat、Jetty 或 Undertow打包后的 Jar 可以直接通过java -jar运行。52. Spring Boot 如何读取配置application.propertiesapplication.yml命令行参数环境变量配置中心通过Value、ConfigurationProperties、Environment读取。53. Spring Boot 如何实现热部署引入spring-boot-devtools依赖修改代码后自动重启应用。54. Spring Boot 的启动流程是怎样的构造SpringApplication。准备环境。创建ApplicationContext。执行refresh。启动内嵌容器。执行 Runner。发布ApplicationReadyEvent。55. Spring Boot 和 Spring 有什么关系Spring Boot 是 Spring 的封装和增强它简化了 Spring 应用的配置和部署但底层仍然是 Spring。第六部分Spring Cloud / 微服务问题 56-6356. 什么是微服务微服务是一种架构风格把单一应用拆分为一组小型服务每个服务独立开发、部署、运行通过轻量级协议通信。57. Spring Cloud 是什么Spring Cloud 是一套微服务解决方案提供服务注册发现、配置中心、负载均衡、熔断限流、网关、链路追踪等能力。58. 服务注册和发现有哪些常见方案EurekaNacosConsulZookeeperKubernetes Service59. 什么是负载均衡Ribbon 和 LoadBalancer 有什么区别负载均衡是把请求分发到多个实例上。Ribbon 是 Netflix 的负载均衡组件已进入维护模式LoadBalancer 是 Spring Cloud 官方替代方案。60. 什么是熔断和降级熔断当下游服务错误率超过阈值时快速失败避免雪崩。降级当服务不可用时返回兜底数据。常见实现Hystrix、Resilience4j、Sentinel。61. 什么是网关Spring Cloud Gateway 有什么特点网关是微服务的统一入口负责路由、鉴权、限流、日志等。Spring Cloud Gateway 基于 WebFlux 和 Reactor性能高、支持异步非阻塞。62. 什么是配置中心配置中心用于统一管理分布式系统的配置支持动态刷新。常见方案Spring Cloud Config、Nacos、Apollo、Consul。63. 什么是链路追踪链路追踪用于记录请求在多个服务之间的调用链路帮助排查性能问题和定位故障。常见方案Zipkin、SkyWalking、Jaeger。第七部分总结与答题建议7.1 答题建议先结论后展开每个问题先给一句话结论再展开细节。结合源码能提到关键类名和方法名会显得更有深度。主动延伸回答完问题后主动补一句「这块还有一个常见的追问是……」引导面试官进入你准备好的领域。结合实战能说出自己在项目中遇到的坑和解决方案比背概念更有说服力。7.2 一句话总结Spring 的 63 个高频问题本质上都是围绕IoC、AOP、事务、MVC、Boot、Cloud这六大主线展开。把这六条主线吃透再结合源码细节和实战经验就能在面试中从容应对。