spring 事务

为什么需要 Spring 事务管理? 数据库本身已经提供了事务机制,能够通过 COMMIT 和 ROLLBACK 等操作实现事务的提交与回滚。 但是,在 Java 项目中,如果直接使用 JDBC 管理数据库事务,开发者通常需要手动控制事务的开启、提交和回滚。 例如: 1 2 3 4 5 6 7 8 9 10 11 12 try { connection.setAutoCommit(false); // 创建订单 // 扣减库存 // 扣减余额 connection.commit(); } catch (Exception e) { connection.rollback(); throw new RuntimeException(e); } 上述代码省略了数据库连接的获取、关闭等细节。 这种方式虽然可以实现事务管理,但存在几个问题: 重复代码较多:不同业务方法都需要编写事务开启、提交、回滚等逻辑。 业务逻辑与事务管理耦合:开发者不仅需要关注具体业务,还需要处理事务的生命周期。 事务管理容易出错:如果遗漏回滚操作,或者异常处理不当,就可能导致事务行为不符合预期。 因此,Spring 在底层事务能力之上提供了一套统一的事务管理机制,帮助开发者简化事务控制。 ...

2026-10-19 · 8 分钟 · Yawen Yang

Spring 基础

相关问题 一、Spring IoC 与 Bean 管理(8 题) Spring 框架主要解决了什么问题?什么是 IoC 和 DI? Spring IoC 容器是什么?BeanFactory 和 ApplicationContext 有什么区别? Spring 容器是如何发现、注册和管理 Bean 的?BeanDefinition 起什么作用? Spring Bean 的完整生命周期是什么? Spring 如何实现依赖注入?构造器注入、Setter 注入和字段注入有什么区别? Spring Bean 有哪些作用域?默认单例 Bean 是线程安全的吗? 什么是循环依赖?Spring 为什么需要三级缓存来解决循环依赖? BeanPostProcessor 是什么?它在 Bean 生命周期中起什么作用? 二、Spring AOP 与动态代理(5 题) 什么是 AOP?Spring 为什么需要 AOP?它和 IoC 有什么关系? 什么是动态代理?JDK 动态代理和 CGLIB 有什么区别? Spring AOP 的核心概念有哪些?切面、切点、通知分别是什么? Spring AOP 的底层实现原理是什么?代理对象是如何创建和执行的? Spring AOP 在什么情况下会失效?为什么同类内部方法调用可能导致 AOP 失效? Spring IoC 在传统的 Java 开发中,对象之间往往存在依赖关系。例如,一个 UserService 需要调用 UserDao 来完成数据库操作,最直接的方式就是在 UserService 内部通过 new 创建一个 UserDao 对象。 ...

2026-10-16 · 8 分钟 · Yawen Yang

java基础

相关问题 == 和 equals() 有什么区别? 为什么重写 equals() 通常也要重写 hashCode()? Object 类里常见的方法有哪些? Java 是值传递还是引用传递? String 为什么是不可变的? String、StringBuilder、StringBuffer 有什么区别? 字符串常量池是什么?new String("abc") 创建几个对象? Integer 缓存是什么?为什么 Integer 127 == 127 可能为 true,而 128 不一定? 自动装箱和拆箱是什么? 重载和重写有什么区别? 接口和抽象类有什么区别? Java 怎么实现多态? final 修饰类、方法、变量分别代表什么? this 和 super 有什么区别? Java 的异常体系是怎样的? Checked Exception 和 RuntimeException 有什么区别? throw 和 throws 有什么区别? try-catch-finally 的执行顺序是什么?finally 一定会执行吗? 泛型是什么?为什么需要泛型? 什么是泛型擦除? ? extends 和 ? super 有什么区别? 反射是什么?有哪些典型使用场景? Class 对象怎么获取? 反射为什么性能相对差? 注解是什么?怎么自定义注解? 注解是怎么被反射读取的? Java IO 里字节流和字符流有什么区别? BIO、NIO、AIO 有什么区别? NIO 里的 Buffer、Channel、Selector 分别是什么? 什么是零拷贝? 浅拷贝和深拷贝有什么区别? 序列化是什么?transient 有什么作用? 枚举和普通常量相比有什么优势? Lambda 和匿名内部类有什么区别? Stream 是什么?中间操作和终止操作有什么区别? equals/hashCode → String → 面向对象 → 异常 → 泛型 → 反射/注解 → IO/NIO → 其他语言细节。 ...

2026-10-11 · 5 分钟 · Yawen Yang

java集合

相关问题 Java 集合体系有哪些?Collection 和 Map 有什么区别? List、Set、Queue 分别有什么特点? ArrayList 和 LinkedList 有什么区别? ArrayList 底层是什么结构?扩容机制是怎样的? ArrayList 为什么随机访问快、插入删除慢? LinkedList 底层是什么结构?适合什么场景? HashMap 底层数据结构是什么? HashMap 的 put 流程是什么? HashMap 怎么计算哈希和数组下标? HashMap 怎么解决哈希冲突? 为什么 JDK 8 以后链表过长会转成红黑树? HashMap 什么时候扩容?为什么容量通常是 2 的幂? HashMap 扩容时元素怎么迁移? HashMap 为什么线程不安全? HashMap、Hashtable、ConcurrentHashMap 有什么区别? HashSet 底层是怎么实现的?为什么元素不能重复? LinkedHashMap 是怎么保证插入顺序或访问顺序的? TreeMap / TreeSet 底层为什么用红黑树? ArrayDeque 和 LinkedList 作为队列有什么区别? PriorityQueue 底层是什么结构? ConcurrentHashMap JDK 7 和 JDK 8 的实现有什么区别? ConcurrentHashMap 为什么比 Hashtable 并发性能更好? JDK 8 的 ConcurrentHashMap 怎么保证线程安全? CopyOnWriteArrayList 的原理是什么?适合什么场景? BlockingQueue 有哪些常见实现?线程池为什么常用它? 什么是 fail-fast?为什么遍历集合时修改可能抛 ConcurrentModificationException? Iterator 和增强 for 的关系是什么? Comparable 和 Comparator 有什么区别? equals() 和 hashCode() 为什么要一起重写?对 HashMap/HashSet 有什么影响? 什么时候选 ArrayList、LinkedList、HashMap、TreeMap、ConcurrentHashMap? 集合体系 Java 集合大体可以分成两套体系:Collection 和 Map。 ...

2026-10-06 · 7 分钟 · Yawen Yang

类加载机制

相关问题 Java 类从 .class 文件到可以被 JVM 使用,中间经历哪些阶段? 类加载的五个阶段分别做什么? 加载 验证 准备 解析 初始化 “准备”和“初始化”有什么区别? static 变量在准备阶段和初始化阶段分别会发生什么? 类什么时候会触发初始化? 哪些情况不会触发类初始化? JVM 中常见的类加载器有哪些? 什么是双亲委派模型? 双亲委派的完整加载流程是什么? 为什么要使用双亲委派? 双亲委派怎么避免核心类被重复加载或篡改? 什么叫“同一个类”?只看类名一样就算同一个类吗? 不同 ClassLoader 加载同一个 .class,得到的 Class 是同一个吗? 哪些场景会打破双亲委派? SPI 为什么会涉及打破双亲委派? Tomcat 为什么要自定义 ClassLoader? 自定义 ClassLoader 一般怎么实现? Class.forName() 和 ClassLoader.loadClass() 有什么区别? 类加载器和类卸载有什么关系? 什么情况下类可以被卸载? 类加载流程 一个 .class 文件真正被 JVM 使用之前,通常会经历: 1 2 3 4 5 加载 → 验证 → 准备 → 解析 → 初始化 加载阶段就是把 .class 文件读进 JVM。 ...

2026-10-05 · 3 分钟 · Yawen Yang

问题排查

Full GC 频繁怎么排查 Full GC 频繁通常说明老年代或者元空间压力比较大,也可能是代码或参数配置导致 GC 退化。 排查时先看三个东西: 1 2 3 Full GC 发生频率 单次停顿时间 Full GC 之后内存是否明显下降 如果 Full GC 之后老年代占用明显下降,比如: 1 2 GC 前:90% GC 后:30% 说明对象大部分其实是可以回收的,更像是对象创建太快、堆太小,或者大量对象过早晋升到了老年代。 这时可以继续看: 1 2 3 4 Young GC 是否过于频繁 对象晋升速度是否过快 新生代是否太小 是否存在大量大对象 如果 Full GC 之后老年代几乎不下降: 1 2 GC 前:90% GC 后:85% 而且后面还在持续上涨,就要重点怀疑: 大量对象长期存活,甚至存在内存泄漏。 这时候通常需要导出 Heap Dump,分析: 1 2 3 哪些对象占用内存最多 哪些对象数量异常 这些对象为什么一直被 GC Roots 引用 另外还要关注 Full GC 的触发原因,比如: ...

2026-10-05 · 2 分钟 · Yawen Yang

GC

相关问题 什么是 GC?Java 为什么仍然可能发生内存泄漏? JVM 怎么判断一个对象是否可以回收? 引用计数法 可达性分析 GC Roots 常见的 GC Roots 有哪些? 什么是三色标记法?并发标记为什么会有漏标和多标问题? Java 的强引用、软引用、弱引用、虚引用有什么区别? 常见垃圾回收算法有哪些? 标记-清除 复制 标记-整理 为什么 JVM 要采用分代收集? 新生代和老年代分别存什么对象?为什么适合不同的回收算法? Eden、Survivor 0、Survivor 1 是怎么配合工作的? 对象什么时候会进入老年代? Young GC、Major GC、Full GC 有什么区别? 哪些情况可能触发 Full GC?为什么 Full GC 通常比较慢? 什么是 STW?为什么 GC 过程中需要暂停业务线程? 什么是 Safepoint?它和 STW 有什么关系? 什么是 Card Table / Remembered Set?为什么 Young GC 不能直接扫描整个老年代? CMS 的工作流程是什么?它有哪些优缺点? G1 的核心设计是什么? Region Young GC Mixed GC 为什么叫 Garbage First 为什么能控制停顿时间 ZGC 的核心特点是什么?为什么能做到低停顿? G1 和 ZGC 怎么选? 线上 GC 问题怎么排查? Young GC 频繁 Full GC 频繁 GC 后内存降不下来 Heap Dump 常用工具和指标 JVM 怎么判断对象是否可以回收 垃圾回收的第一步,是先判断哪些对象已经没有用了。 ...

2026-10-04 · 8 分钟 · Yawen Yang

jvm内存结构

相关问题 JVM 运行时数据区有哪些? 哪些区域是线程私有,哪些是线程共享? 程序计数器是干什么的?为什么它是线程私有的? 虚拟机栈里存什么? 一个方法调用时,栈帧里有哪些内容? 本地方法栈是什么?和虚拟机栈有什么区别? Java 堆里主要存什么? 栈和堆有什么区别? 方法区主要存什么? 元空间是什么?和永久代有什么区别? 为什么 JDK 8 把永久代换成了元空间? 运行时常量池是什么?放在哪里? 字符串常量池放在哪里? static 变量放在哪里? 一个 Java 对象创建以后通常存在哪里? 对象引用和对象本身分别可能存在哪里? Java 对象在内存中的结构是什么? 对象头里有哪些内容?Mark Word 是什么? 什么情况下会出现 StackOverflowError? 哪些内存区域可能出现 OutOfMemoryError? 线程创建太多为什么可能导致 OOM? 直接内存是什么?属于 JVM 运行时数据区吗? ByteBuffer.allocateDirect() 为什么可能导致直接内存 OOM? 内存结构:内存分哪几块、每块放什么。 GC:堆里的对象怎么分代、怎么判断垃圾、怎么回收。 JVM整体内存结构 JVM 在运行 Java 程序时,会把运行过程中需要使用的内存划分成几个不同的区域,每个区域负责保存不同类型的数据。 从整体上看,可以先分成两类:线程私有区域和线程共享区域。 线程私有区域包括程序计数器、虚拟机栈和本地方法栈。每个线程都会有自己独立的一份,线程之间不会直接共用。 线程共享区域主要包括堆和方法区,也就是后面常说的元空间相关内容,这些区域会被多个线程共同访问。 1 2 3 4 5 6 7 8 9 10 JVM 内存 ├── 线程私有 │ ├── 程序计数器 │ ├── 虚拟机栈 │ └── 本地方法栈 │ └── 线程共享 ├── 堆 └── 方法区 / 元空间 程序计数器用来记录当前线程执行到哪一条字节码指令。因为线程可能随时被切换出去,之后重新获得 CPU 时,需要知道应该从哪里继续执行,所以每个线程都必须有自己独立的程序计数器。 ...

2026-10-03 · 3 分钟 · Yawen Yang

ThreadLocal

相关问题 ThreadLocal 是什么?它解决什么问题? ThreadLocal 和加锁有什么区别? ThreadLocal 的数据到底存在哪里? ThreadLocalMap 是什么?为什么每个线程都有自己的 ThreadLocalMap? ThreadLocal.set() 的完整流程是什么? ThreadLocal.get() 的完整流程是什么? ThreadLocalMap 为什么不是普通的 HashMap? ThreadLocalMap 发生哈希冲突时怎么处理? 为什么 ThreadLocalMap 的 key 是弱引用? 为什么 key 用弱引用以后,仍然可能发生内存泄漏? ThreadLocal 内存泄漏到底泄漏的是什么? 为什么使用完 ThreadLocal 通常要调用 remove()? 在线程池里使用 ThreadLocal 为什么风险更大? ThreadLocal 的 key 被 GC 以后,value 是怎么被清理的? ThreadLocalMap 什么时候会清理过期 Entry? ThreadLocal 能实现父子线程之间的数据传递吗? InheritableThreadLocal 是怎么实现的? 为什么在线程池里 InheritableThreadLocal 也可能失效? TransmittableThreadLocal 解决了什么问题? ThreadLocal 的典型使用场景有哪些? ThreadLocal 有哪些不适合使用的场景? ThreadLocal 是线程安全的吗?为什么? 一个线程可以有多个 ThreadLocal 吗?它们的数据怎么区分? 同一个 ThreadLocal 被多个线程使用时,为什么不会互相覆盖? 如果让你手写一个简化版 ThreadLocal,核心结构会怎么设计? ThreadLocal 的作用 ThreadLocal 用来为每个线程保存一份独立的数据。 ...

2026-10-02 · 2 分钟 · Yawen Yang

volatile+CAS

相关问题 volatile 是什么?它主要解决什么问题? volatile 为什么能保证可见性? volatile 为什么能保证有序性? volatile 能保证原子性吗?为什么 count++ 仍然线程不安全? volatile 和 synchronized 有什么区别? volatile 的典型使用场景有哪些? 双重检查单例为什么一定要加 volatile? 什么是 happens-before?volatile 的 happens-before 规则是什么? volatile 底层是怎么实现的?内存屏障起什么作用? CAS 是什么?Compare And Swap 比较和交换的三个值分别是什么? CAS 为什么能保证一次更新操作的原子性? CAS 和自旋是什么关系? CAS 为什么被称为无锁并发? CAS 失败以后会发生什么?为什么高竞争下会浪费 CPU? 什么是 ABA 问题? ABA 为什么有时候会导致问题? ABA 怎么解决?版本号和 AtomicStampedReference 是怎么做的? CAS 有哪些局限? 高竞争下自旋开销 ABA 单变量更新更合适 AtomicInteger 为什么线程安全?底层和 CAS 有什么关系? AtomicInteger.incrementAndGet() 大致是怎么实现的? CAS 和 synchronized / ReentrantLock 有什么区别? CAS 适合什么场景,锁又适合什么场景? 为什么 AQS、Atomic 类、轻量级锁里都会大量使用 CAS? LongAdder 为什么在高并发下通常比 AtomicLong 更合适? LongAdder 为什么最终值不是每次更新时都集中写到一个变量上? volatile 的作用 volatile 是 Java 提供的一种轻量级同步机制,主要解决两个问题:可见性和有序性。 ...

2026-10-02 · 2 分钟 · Yawen Yang