IOC & Bean
什么是 IOC?
控制反转,把对象创建和依赖交给 Spring 容器管理,不由开发者 new。
什么是 DI?
依赖注入,容器自动给 Bean 注入依赖对象。
Bean 的作用域有哪些?
singleton 单例、prototype 多例、request、session、application。
Spring Bean 默认是单例吗?
是,容器级单例。
Bean 生命周期?
实例化→属性填充→初始化→销毁。
依赖注入三种方式?
构造器注入、Set 注入、字段 @Autowired 注入。
@Autowired 和 @Resource 区别?
Autowired 默认按类型,Resource 默认按名称。
什么是循环依赖?
A 依赖 B,B 依赖 A,互相依赖。
Spring 怎么解决循环依赖?
三级缓存 + 提前暴露对象。
三级缓存分别是什么?
一级:单例池;二级:半成品 Bean;三级:Lambda 工厂对象。
为什么需要三级缓存,二级不行?
解决 AOP 代理对象循环依赖。
哪些情况循环依赖解决不了?
构造器注入、多例 Bean。
BeanFactory 和 ApplicationContext 区别?
BeanFactory 懒加载,ApplicationContext 立即初始化,功能更强。
Spring 容器启动流程?
加载配置→扫描 Bean→注册 Bean 定义→实例化单例 Bean→初始化。
@Component、@Controller、@Service、@Repository 区别?
功能一样,只是语义分层。
AOP 面向切面
什么是 AOP?
面向切面,不修改源码对方法增强:日志、事务、权限、限流。
AOP 核心术语?
切点、连接点、切面、通知、目标对象、代理。
通知类型有哪些?
前置、后置、返回、异常、环绕通知。
Spring AOP 用什么动态代理?
有接口用JDK 动态代理,无接口用Cglib。
JDK 和 Cglib 区别?
JDK 基于接口,Cglib 继承子类,无需接口。
AOP 为什么不能增强 private 方法?
代理只能重写 public/protected,私有方法无法代理。
AOP 应用场景?
日志记录、事务控制、权限校验、限流、缓存。
事务
Spring 事务实现原理?
AOP 动态代理,拦截方法开启 / 提交 / 回滚事务。
事务隔离级别?
读未提交、读已提交、可重复读、串行化。
MySQL 默认隔离级别?
可重复读 RR。
事务传播机制有哪些?
REQUIRED、SUPPORTS、REQUIRES_NEW、NESTED 等 7 种。
@Transactional 什么时候失效?
方法 private
内部本类调用
无 Spring 代理
异常被 try-catch 吃掉
传播级别配置错误
事务嵌套怎么处理?
REQUIRES_NEW 新开事务,互不影响;NESTED 嵌套子事务。
什么是脏读、不可重复读、幻读?
脏读读未提交;不可重复读同一事务两次查询不同;幻读新增删除。
Spring 编程式事务 vs 声明式事务?
编程式手动写代码,声明式注解 @Transactional 简洁常用。