当前位置: 首页 > backend >正文

Java 高频面试考点(下)

一、Spring 系列核心考点

1. SpringMVC 的工作流程(高频考点)

SpringMVC 是基于 MVC 架构的 Web 框架,核心是 DispatcherServlet(前端控制器),其工作流程可分为以下步骤:

  1. 用户请求:客户端发送请求至 DispatcherServlet;
  2. 匹配处理器:DispatcherServlet 通过 HandlerMappingMapping(处理器映射器)查找对应的 Handler(处理器);
  3. 适配处理器:DispatcherServlet 调用 HandlerAdapter(处理器适配器),由其执行 Handler;
  4. 处理业务:Handler 执行完毕返回 ModelAndView 对象(包含数据和视图名);
  5. 解析视图:DispatcherServlet 将 ModelAndView 传给 ViewResolver(视图解析器),解析得到具体 View;
  6. 响应客户端:View 渲染数据后,将结果返回给客户端。

核心组件:DispatcherServlet(调度中心)、HandlerMapping(映射请求与处理器)、HandlerAdapter(适配执行处理器)、ViewResolver(解析视图)。

2. Spring 的事务管理

Spring 事务管理的核心是声明式事务(基于 AOP),无需手动编写事务控制代码,主要特点:

  • 事务传播行为:定义多个事务方法调用时的事务规则(如 REQUIRED:如果当前有事务则加入,否则新建;REQUIRES_NEW:无论是否有事务,都新建事务);
  • 事务隔离级别:解决并发问题(如读未提交、读已提交、可重复读、串行化);
  • 优点
    1. 简化代码:通过注解(@Transactional)或 XML 配置即可实现事务控制;
    2. 统一管理:支持不同数据源(JDBC、Hibernate 等)的事务,底层通过 PlatformTransactionManager 接口适配;
    3. 灵活性:可精细控制事务的传播行为、隔离级别、超时时间等。

3. Spring AOP 核心概念

AOP(面向切面编程)用于解决分散在多个模块的通用功能(如日志、权限)的代码复用问题:

  • 连接点(Joinpoint):程序执行过程中可被拦截的点(如方法调用、字段访问);
  • 切入点(Pointcut):筛选出需要被拦截的连接点(通过表达式定义,如 "所有 Service 类的 add 方法");
  • 通知(Advice):拦截后执行的操作(前置通知 @Before、后置通知 @After、异常通知 @AfterThrowing、返回通知 @AfterReturning、环绕通知 @Around);
  • 切面(Aspect):切入点 + 通知的组合,定义 "在什么地方做什么事";
  • 底层实现:基于动态代理(JDK 动态代理:针对接口;CGLIB:针对类,生成子类)。

4. @Autowired 与 @Resource 的区别(高频考点)

  • @Autowired:Spring 提供的注解,默认按类型(byType)装配,可配合 @Qualifier 指定名称;
  • @Resource:JDK 提供的注解,默认按名称(byName)装配,若找不到再按类型;
  • 区别:来源不同(Spring vs JDK)、默认装配方式不同、支持的参数不同(@Resource 有 name 和 type 属性,@Autowired 有 required 属性)。

其他 Spring 相关知识点

  • Bean 的作用域:singleton(单例,默认)、prototype(多例)、request(请求域)、session(会话域)等;
  • 自动装配:Spring 自动匹配 Bean 之间的依赖关系,可通过 xml 的 autowire 属性或注解实现;
  • Bean 工厂与 ApplicationContext 的区别:ApplicationContext 是 BeanFactory 的子接口,增加了事件发布、国际化等功能,且默认预初始化单例 Bean(BeanFactory 懒加载)。

二、MyBatis 核心考点

1. MyBatis 的动态 SQL(高频考点)

动态 SQL 用于根据条件动态生成 SQL 语句,核心标签:

  • <if>:条件判断(如<if test="name != null">AND name = #{name}</if>);
  • <where>:自动处理 AND/OR 前缀,替代手动写 WHERE 1=1;
  • <foreach>:遍历集合(如批量插入INSERT INTO user(id) VALUES <foreach collection="ids" item="id" separator=",">(#{id})</foreach>);
  • <choose>:类似 switch-case,包含<when><otherwise>
  • 原理:MyBatis 解析 XML 时将动态标签转换为对应的 SQL 片段,执行时根据参数动态拼接。

2. MyBatis 的插件原理(高频考点)

MyBatis 插件基于拦截器实现,可拦截四大核心接口:Executor(执行器)、StatementHandler(SQL 语句处理器)、ParameterHandler(参数处理器)、ResultSetHandler(结果集处理器)。

运行原理

  1. 插件实现 Interceptor 接口,重写 intercept(拦截逻辑)、plugin(生成代理对象)、setProperties(设置属性)方法;
  2. 通过 @Intercepts 注解指定拦截的接口和方法;
  3. MyBatis 初始化时将插件注册到 Configuration 中,为目标接口生成代理对象;
  4. 执行对应方法时,触发代理对象的拦截逻辑。

编写插件示例

@Intercepts({@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})})
public class MyPlugin implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {// 拦截前逻辑(如打印SQL)Object result = invocation.proceed(); // 执行原方法// 拦截后逻辑return result;}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this); // 生成代理对象}// setProperties方法略
}

3. MyBatis 的延迟加载(高频考点)

  • 支持延迟加载:针对关联查询(如一对一、一对多),默认不加载关联对象,直到真正使用时才查询。
  • 实现原理
    1. 对关联对象使用 CGLIB 或 JDK 动态代理生成代理对象;
    2. 当调用代理对象的方法时,触发拦截器,执行关联查询的 SQL;
    3. 需在配置中开启:lazyLoadingEnabled=true(全局开关)、aggressiveLazyLoading=false(按需加载)。

4. MyBatis 的结果映射(高频考点)

MyBatis 将 SQL 结果封装为目标对象的方式:

  • 自动映射:列名与对象属性名一致时,自动匹配(可通过mapUnderscoreToCamelCase=true开启下划线转驼峰);
  • 手动映射:通过<resultMap>标签指定列与属性的对应关系(如<result column="user_name" property="userName"/>);
  • 关联映射
    • 一对一:<association property="user" javaType="User" select="selectUser" column="user_id"/>
    • 一对多:<collection property="orders" ofType="Order" select="selectOrders" column="user_id"/>

其他 MyBatis 知识点

  • Executor 执行器:SimpleExecutor(默认,每次执行新建 Statement)、ReuseExecutor(复用 Statement)、BatchExecutor(批量执行);
  • 半自动 ORM:需手动编写 SQL,而 Hibernate 等全自动 ORM 可自动生成 SQL;
  • include 标签:被引用的 B 标签可在 A 标签后定义(MyBatis 解析时会先收集所有标签再处理引用)。

三、Java 基础与多线程

1. 线程状态与转换(高频考点)

Java 线程有 6 种状态(Thread.State):

  • 新建(New):线程对象创建后未启动;
  • 运行(Runnable):调用 start () 后,包含就绪和运行中状态;
  • 阻塞(Blocked):等待 synchronized 锁;
  • 等待(Waiting):调用 wait ()、join () 等方法,需被唤醒;
  • 超时等待(Timed Waiting):调用 sleep (time)、wait (time) 等,超时后自动唤醒;
  • 终止(Terminated):线程执行完毕。

转换流程:New → Runnable(start ())→ 阻塞 / 等待 / 超时等待 → Runnable → Terminated。

2. sleep () 与 wait () 的区别(高频考点)

  • 所属类:sleep () 是 Thread 的静态方法;wait () 是 Object 的方法;
  • 锁释放:sleep () 不释放锁;wait () 释放锁;
  • 使用场景:sleep () 用于暂停执行;wait () 用于线程间通信(配合 notify ()/notifyAll ());
  • 唤醒方式:sleep () 超时自动唤醒;wait () 需被其他线程唤醒或超时唤醒。

3. 死锁的条件与避免(高频考点)

死锁产生的 4 个必要条件

  1. 互斥:资源只能被一个线程占用;
  2. 持有并等待:线程持有部分资源,同时等待其他资源;
  3. 不可剥夺:资源不能被强行剥夺;
  4. 循环等待:线程间形成资源请求循环(如 t1 等 t2 的资源,t2 等 t1 的资源)。

避免方法

  • 按固定顺序获取资源(打破循环等待);
  • 超时释放资源(打破持有并等待);
  • 使用 tryLock () 尝试获取锁,失败则释放已持有的资源。

4. 深拷贝与浅拷贝(高频考点)

  • 浅拷贝:复制对象时,仅复制基本类型字段,引用类型字段仍指向原对象(如 Object.clone () 默认浅拷贝);
  • 深拷贝:复制对象及所有引用类型字段指向的对象(实现方式:重写 clone () 递归拷贝引用对象;通过序列化 / 反序列化)。

其他 Java 基础知识点

  • final 关键字:修饰类(不可继承)、方法(不可重写)、变量(不可修改),不能防止指令重排序,也不能替代 volatile(volatile 保证可见性和禁止指令重排序);
  • 进程与线程:进程是资源分配单位,线程是调度单位;进程间通信(管道、共享内存、Socket 等),线程间通信(wait/notify、共享变量、BlockingQueue 等);
  • 泛型:限制集合元素类型,避免类型转换错误(如List<String> list = new ArrayList<>())。

四、网络协议

1. TCP 三次握手与四次挥手(高频考点)

  • 三次握手(建立连接)

    1. 客户端发送 SYN(同步序列编号),进入 SYN_SENT 状态;
    2. 服务器收到 SYN,回复 SYN+ACK(确认编号),进入 SYN_RCVD 状态;
    3. 客户端收到 SYN+ACK,回复 ACK,双方进入 ESTABLISHED 状态。
      (目的:确保双方收发能力正常,避免无效连接)
  • 四次挥手(断开连接)

    1. 客户端发送 FIN,进入 FIN_WAIT_1 状态;
    2. 服务器收到 FIN,回复 ACK,进入 CLOSE_WAIT 状态(客户端进入 FIN_WAIT_2);
    3. 服务器数据发送完毕,发送 FIN,进入 LAST_ACK 状态;
    4. 客户端收到 FIN,回复 ACK,进入 TIME_WAIT(等待 2MSL 确保服务器收到 ACK),最终关闭。
      (目的:确保双方数据都已传输完毕)

2. TCP 可靠传输机制(高频考点)

  • 校验和:检测数据传输是否出错;
  • 确认应答(ACK):接收方收到数据后回复 ACK,发送方未收到则重传;
  • 超时重传:发送方超时未收到 ACK 则重传数据;
  • 滑动窗口:解决 "发送方等待 ACK 再发下一包" 的效率问题,允许连续发送多个数据包(窗口大小为未确认数据包的最大数量);
  • 拥塞控制:避免网络拥塞(慢启动、拥塞避免、快速重传、快速恢复)。
http://www.xdnf.cn/news/16877.html

相关文章:

  • 【MySQL安全】什么是SQL注入,怎么避免这种攻击:前端防护、后端orm框架、数据库白名单
  • ELECTRICAL靶机
  • SQL157 更新记录(一)
  • Java企业级应用性能优化实战
  • ABAP SQL更新DB小技巧 WITH INDICATORS
  • W3D引擎游戏开发----从入门到精通【10】
  • 第二节 YOLOv5参数
  • 在 macOS 上通过 Docker 部署DM8 (ARM 架构)
  • 团队独立思考的力量
  • 2025-0803学习记录21——地表分类产品的精度验证
  • MySQL存储过程和触发器
  • 【网络安全】日志文件格式
  • 「源力觉醒 创作者计划」_文心大模型4.5系列开源模型, 从一行代码到一个生态:聊聊开源战略那些事儿,顺便扯扯文心大模型 4.5 的使用心得
  • 题解:P4447 [AHOI2018初中组] 分组
  • ospf综合
  • NX947NX955美光固态闪存NX962NX966
  • C++ STL 组件及其关系:从模块化设计到图形化展示
  • [硬件电路-124]:模拟电路 - 信号处理电路 - 测量系统的前端电路详解
  • HTTP数据请求
  • 【密码学】5. 公钥密码
  • 【Linux】多路转接之epoll
  • pytorch简单理解
  • 幂等性介绍和下单接口幂等性保证实现方案
  • python创建一个excel文件
  • realIADD3复现笔记
  • 【BTC】挖矿难度调整
  • AbstractExecutorService:Java并发核心模板解析
  • 入门MicroPython+ESP32:《点亮LED灯》
  • php完整处理word中表单数据的方法
  • K8S部署ELK(一):部署Filebeat日志收集器