直接回答:IoC(控制反转)指对象的创建、依赖装配和生命周期交给 Spring 容器管理,而不是代码里自己 new;DI(依赖注入)是其实现手段,容器按声明把依赖"注入"给对象。AOP(面向切面编程)把日志、事务、权限这类遍布各处的横切逻辑抽成"切面",在不修改业务代码的前提下织入到方法执行的前前后后。
展开解析:
- IoC 的好处是解耦:类只声明"我需要什么",不关心"怎么来的",替换实现、做单元测试(注入 mock)都很容易。注入方式有构造器注入(推荐,依赖不可变且可发现缺失)、Setter 注入、字段注入。
- AOP 基于动态代理实现:接口用 JDK 动态代理,无接口的类用 CGLIB 生成子类代理。核心概念包括切面(Aspect)、切点(Pointcut,在何处生效)、通知(Advice:前置/后置/环绕/异常/最终)。
例子:@Transactional 就是 AOP 的典型应用——业务方法里没有任何事务代码,代理在方法前开启事务、成功后提交、异常时回滚。
追问方向:BeanFactory 与 ApplicationContext 的区别、CGLIB 为什么代理不了 final 方法、AOP 的自调用失效问题。