Spring 面试题 真正的 offer 偏方 Java 基础 Java 高级

Spring 面试题 真正的 offer 偏方 Java 基础 Java 高级

一、参考资料

【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=125\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528

二、笔记总结

01、Conditional 注解有什么用

  • Conditional 注解的作用是为 Bean 的装载提供条件判断,只有在满足条件的情况下,Spring 才会把当前的 Bean 装载到 IOC 容器里面。
  • Conditional 注解增加了 Bean 自动装配的灵活性。

02、Spring 里面的事务和分布式事务的使用如何区分

  • Spring 中提供了对数据库事务管理的封装,我们可以通过声明式事务使得开发人员从复杂的事务处理中脱离处理。
  • Spring 里面的事务主要针对单个数据库里多个数据表的操作。
  • 分布式事务是解决多个数据库操作的事务一致性问题,传统的关系型数据库不支持跨库的事务操作,所以需要因为分布式事务解决方案。
  • 比如引入 Seata 框架解决分布式事务的问题。

03、Spring 中有两个 id 相同的 bean 会报错吗

  • 在同一个 xml 配置文件中不能存在 id 相同的两个 bean,否则 Spring 容器在启动时会报错。
  • 但是在两个不同的 xml 配置文件中可以存在 id 相同的 bean,IOC 容器在加载 Bean 的时候默认会把 id 相同的 bean 进行覆盖。
  • 在 Spring 3 中,使用 Configuration 注解生命配置类,是 Bean 注解实现 Bean 的声明,取代了 xml 的配置形式。
    • 在同一个配置类生命多个相同名字的 bean,Spring IOC 容器在解析时只会注册第一个声明的 Bean,后面重复的不会注册。

04、Spring 中 Bean 的作用域有哪些

【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=128\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528

05、Spring 如何解决循环依赖问题

  • Spring 设计了三级缓存解决循环依赖问题
    • 第一级缓存存储完成的 Bean 实例
    • 第二级缓存存储实例化以后还没有进行依赖注入的 Bean 实例
    • 第三级缓存用来存放 Bean 工厂
  • 三级缓存的核心实现就是 Bean 的实例化和 Bean 里面的依赖注入进行分离,采用一级缓存存储完整的 Bean 实例,二级缓存存储不完整的 Bean 实例,通过不完整的 Bean 实例作为突破口解决循环依赖问题,第三级缓存主要是解决代理对象的循环依赖问题。

06、Spring 中 BeanFactory 和 FactoryBean 的区别

【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=130\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528

07、Spring 中事务的传播行为有哪些

  • 多个声明了事务的方法相互调用时事务应该如何传递
  • 方法 A 和 方法 B 都开启了事务,方法 A 调用方法 B,方法 B 是开启新事物还是继续在方法 A 的事务中执行,取决于事务的传播行为。
  • 在 Spring 中定义了七种事务传播行为,默认是 REQUIRED,如果当前存在事务,就加入当前事务,如果不存在事务就新建一个事务。

08、Spring 中有哪些方式可以把 Bean 注入到 IOC 容器中

【25年新版Java面试场景题+八股文!真正的offer偏方,跳槽面试你一定用得上!Java面试丨Java场景题丨Java丨Java基础丨Java高级】 https://www.bilibili.com/video/BV1w44y1w7Zh/?p=133\&share_source=copy_web\&vd_source=855891859b2dc554eace9de3f28b4528

09、过滤器和拦截器有什么区别

  • 运行的顺序不同
    • 过滤器是 servlet 容器接收到请求之后 servlet 调用之前运行
    • 拦截器是在 servlet 被调用之后,响应发送到客户端之前运行。
  • 配置方式不同
    • 过滤器在 web.xml 配置
    • 拦截器在 Spring 配置文件配置或使用注解
  • 过滤器依赖 servlet 容器,拦截器不依赖。
  • 过滤器只能对 request 和 response 进行操作,拦截器多了对 SpringMVC 组件的操作。

10、说说 SpringMVC 的执行流程

  • 用户发起请求
  • dispatcherServlet 核心控制器接收到请求并转发给 HandlerMapping
  • HandlerMapping 解析请求找到对应的 Controller
  • Controller 方法执行完以后返回 ModelAndView
  • 视图解析器把数据填充到视图,渲染为 html 返回给客户端。

11、说说你对 SpringMVC 的理解

  • SpringMVC 属于 Spring Framework 生态里的一个模块。
  • 它是在 servlet 的基础上构建并且使用了 MVC 模式设计的一个 Web 框架。
  • 它的主要目的是为了简化传统的 servlet 加 jsp 的 web 开发方式。
  • Spring MVC 的工作流程
    • 用户发起请求
    • dispatcherServlet 核心控制器接收到请求并转发给 HandlerMapping
    • HandlerMapping 解析请求找到对应的 Controller
    • Controller 方法执行完以后返回 ModelAndView
    • 视图解析器把数据填充到视图,渲染为 html 返回给客户端。

12、为什么要使用 Spring 框架

  • Spring 是一个轻量级应用框架,提供了 IOC 和 AOP 两个核心功能,核心目的是为了简化企业级应用开发使得开发者只需要关系业务需求,不需要关心 Bean 的管理,以及通过切面的方式对功能进行增强,从而减少代码的侵入性。
  • Spring 的技术成熟度和社区活跃度都非常高,遇到问题时,可以得到及时的响应。

13、为什么有些公司禁止使用 @Transactional 声明式事务

  • 如果方法执行时间长,加 @Transactional,容易引发长事务问题,长事务会带来锁的竞争影响性能,同时也会导致数据库连接池被消耗尽影响程序正常执行。
  • 如果方法嵌套调用,方法都加了 @Transactional 声明式事务,这时候就会出现事务嵌套,容易引起事务混乱造成程序运行结果错误。
  • @Transactional 是把事务控制放在注解中,如果项目的复杂度增加事务的控制可能会变的更加复杂,导致代码的可读性和维护性下降。
  • 为了避免这些问题,有些公司推荐使用编程式事务,这样可以更加灵活的去控制事务的范围,减少事务的锁定时间,提高系统的性能。
相关推荐
摇滚侠9 分钟前
git ignore 忽略 .idea 目录 全新项目(尚未提交过 .idea).idea 已经被 Git 跟踪(已提交过)
java·git·intellij-idea
linge_sun9 分钟前
SpringAI SQL 智能助手实战:用自然语言查询数据库
java·人工智能·ai编程
熟悉的新风景10 分钟前
maven常用依赖
java·maven
light blue bird11 分钟前
3C 数码电子BOM 协同工作台组件
java·开发语言·jvm·windows·.net·桌面端
copyer_xyf15 分钟前
Python 迭代器与生成器
前端·后端·python
我是一颗柠檬18 分钟前
【Redis】Redis分布式锁Day13(2026年)
java·redis·分布式·缓存
copyer_xyf9 小时前
Python 异常处理
前端·后端·python
llz_11210 小时前
web-第三次课后作业
前端·后端·web
心之伊始10 小时前
Java 后端接入大模型:从 Token、并发到推理成本的完整估算方法
java·spring boot·性能优化·大模型·llm
BlackTurn11 小时前
技术经理投标
java