IOC&AOP

IOC

什么是IOC?

IOC即控制反转。是一种思想,将创建对象的权力交给外部容器(IOC容器)

IOC解决的问题:

1.降低对象之间的耦合度;
2.使资源管理更简单。

IOC与DI有什么区别?

IOC是一种设计思想,即将本来在程序中手动创建对象的控制权交给第三方比如IOC容器。对于Spring框架而言,IOC就是一个Map(key,value),Mao中存放各种对象。IOC并非Spring独有。
IOC最常见、最合理的实现方法即DI(依赖注入)。

AOP

什么是AOP?

AOP即面向切面编程,AOP是OOP的一种延伸,二者互相补充。核心思想是将横切关注点从业务逻辑中抽离出来,形成一个个切面。

AOP关键术语:

  • 切点 (PointCut):一个切点即一个表达式,用来匹配需要增强被切面增强的连接点。
  • 切面(Aspect):对横切关注点进行封装的类,一个切面是一个类。一个切面可以定义多个通知,实现具体的功能。
  • 连接点(JoinPoint):连接点是方法调用或方法执行的某个特定时刻(方法调用、异常抛出等)。
  • 通知(Advice):通知即切面在某个连接点要执行的操作。通知分为五种类型。分别是前置通知(Before)、后置通知(After)、返回通知(AfterReturning)、异常通知(AfterThrowing)和环绕通知(Around)。
  • 织入(Weaving):织入是将切面和目标对象连接起来的过程,即将通知应用到切点匹配的连接点上。常见的织入时期:编译器织入和运行期织入。

AOP常见的通知类型:

  • Before(前置通知):目标对象的方法调用在前触发。
  • After(后置通知):目标对象的方法调用之后触发。
  • AfterReturning(返回通知):目标对象的方法调用完成后触发,返回结果值之后触发。
  • AfterThrowing(异常通知):目标对象的方法执行中抛出异常时触发。如果方法调用成功且无异常,则返回值不受影响。
  • Around(环绕通知):可以在方法调用的前后执行自定义逻辑,甚至可以控制方法的执行,具有完全的控制权。

AOP解决了什么问题?

OOP不能很好的处理分散在多个类或对象中的公共行为,即横切关注点。而AOP可以将横切关注点从核心业务逻辑中分离出来,实现关注点的分离。

AOP常见应用场景?

  • 日志记录:自定义日志记录注解,利用 AOP,行代码即可实现日志记录。
  • 性能统计:利用 AOP 在目标方法的执行前后进行统计,方便优化和分析。
  • 事务管理:@Transactional 注解可以让 Spring 为我们进行事务管理,避免了重复的事务管理逻辑。@Transactional 注解是基于 AOP 实现的。
  • 权限控制:利用 AOP 在目标方法执行前判断用户是否具备所需的权限,如果具备,就执行目标方法,否则就不执行。例如,SpringSecurity 利用 @PreAuthorize 注解一行代码即可自定义权限校验。
  • 接入限制:利用 AOP 在目标方法执行前进行请求参数的校验和实现请求排队限流处理。
  • 缓存管理:利用 AOP 在目标方法执行后进行缓存的读取和更新。

AOP实现方式有哪些?

AOP常见实现方式有动态代理和字节码操作两种方式。

Spring AOP与AspectJ AOP有什么区别?

Spring AOP 属于运行时增强,而 AspectJ 是编译时增强。Spring AOP 基于代理 (Proxy),而 AspectJ 基于字节码操作(Bytecode Manipulation)。
Spring AOP 已经集成了 AspectJ,AspectJ 应该算的是 Java 生态系统中最完整的 AOP 框架了。AspectJ 相比于 Spring AOP 功能更加强大,但是 Spring AOP 相对来说更简单。
如果我们的切面比较少,那么两者性能差异不大。但是,当切面太多的时候,最好选择 AspectJ,它比 Spring AOP 快很多。


IOC&AOP
http://bloomivy.github.io/2025/01/19/Spring-IOC原理及实现/
作者
Bloom
发布于
2025年1月19日
许可协议