IOC和AOP

IOC

IOC (Inversion of Control )即控制反转/反转控制。它是一种思想不是一个技术实现。

为什么叫控制反转?

  • 控制:创建对象的权利
  • 反转: 控制权交给外部环境(IOC容器)

传统的开发方式:使用new来手动创建一个对象,手动管理

使用IOC思想开发: 不是通过new关键字来创建对象,而是通过IOC容器来帮助我们实例化对象。需要哪个对象就去IOC容器中取。

IOC解决了什么问题

  1. 耦合度问题:传统的编程模型中,组件之间通常是通过直接创建和引用对象来实现依赖关系的,这导致了高耦合度。当一个组件直接依赖于另一个组件时,它们之间的修改会相互影响,降低了代码的灵活性和可维护性。IOC 通过将依赖关系外部化,降低了组件之间的耦合度。
  2. 灵活性问题:在传统的编程模型中,组件之间的依赖关系通常是硬编码在代码中的,这导致了系统的灵活性较低。而 IOC 可以通过配置或者依赖注入等机制,动态地管理组件之间的依赖关系,从而提高了系统的灵活性和可扩展性

例子:现在2层结构,Service层和Dao层

在没有使用IOC思想的情况下,Service层调用Dao层就需要使用new来手动创建出Dao层中的具体接口实现类对象。

但是在一个接口有多个接口实现类时,之前那个Dao层的实例对象需要替换成另一个接口实现类时,就要手动替换,如果替换的地方多了就需要消费大量的精力

如果我们使用IOC容器去管理,我们只需要在使用的时候去向IOC容器中取就可以了

IOC和DI区别

DI(Dependency Injection):依赖注入。DI 是IOC的一种具体实现方式,指的是通过外部注入依赖关系来实现IOC。依赖注入可以通过构造函数注入、属性注入或者方法注入等方式来实现。通过依赖注入,可以将一个对象所依赖的其他对象的创建和管理交给外部容器或框架,从而实现了IOC。

可以说DI是IOC的一种实现方式,它通过外部注入依赖关系来实现控制反转。在实际应用中,通常会将IOC和DI一起使用,以实现松耦合的软件设计

AOP

AOP:面向切面编程。核心思想是将横切关注点从核心业务逻辑中分离出来形成切面

AOP的关键术语:

  • 连接点(JoinPoint):需要在程序中插入横切关注点的点,连接点可能是在类初始化、方法调用、字段调用或处理异常等等。Spring中只支持方法执行连接点。
  • 切入点(Pointcut):一组相关连接点的集合。
  • 通知(Advice):在连接点上执行的行为,增强提供了在AOP中需要在切入点所选择的连接点处进行扩展现有行为的手段。包括前置增强(before advice)、后置增强 (after advice)、环绕增强 (around advice)。
  • 切面(Aspect):通知和切入点的结合。
  • 织入(Weaving):织入是一个过程,是将切面应用到目标对象从而创建出AOP代理对象的过程。
  • 代理(Proxy):通过代理方式来对目标对象应用切面。AOP代理可以用JDK动态代理或CGLIB代理实现。
  • 目标对象(Target):需要被织入关注点的对象。即被代理的对象。

解决了什么问题?

面向对象编程(OOP)在处理分散在多个类或对象中的公共行为(如日志记录、事务管理、权限控制、接口限流、接口幂等等)方面存在一些挑战。这些行为通常被称为横切关注点(cross-cutting concerns)。如果我们在每个类或对象中都重复实现这些行为,会导致代码的冗余、复杂和难以维护。

AOP 可以将横切关注点(如日志记录、事务管理、权限控制、接口限流、接口幂等等)从 核心业务逻辑(core concerns,核心关注点) 中分离出来,实现关注点的分离。

AOP实现

AOP的实现方式有动态代理、字节码操作等方式

Spring AOP 基于动态代理实现。当目标对象实现了某个接口时,Spring AOP 将使用 JDK Proxy 来创建代理对象;而对于没有实现接口的目标对象,则无法使用 JDK Proxy 进行代理。在这种情况下,Spring AOP 会转而使用 CGlib 来生成目标对象的子类作为代理对象。

AOP应用场景

  1. 日志记录:在应用程序中添加日志记录功能时,AOP 可以通过在方法执行前后插入日志记录逻辑来实现,而无需在每个方法中手动添加日志记录代码。
  2. 事务管理:在需要进行事务管理的方法中,AOP 可以用来将事务的开启、提交或回滚逻辑进行集中管理,而无需在每个方法中显式处理事务。
  3. 权限控制:通过 AOP,可以将权限检查逻辑切入到需要权限控制的方法中,从而实现统一的权限管理,而无需在每个方法中重复编写权限检查代码。
  4. 接口限流:在高并发环境下,为了保护系统稳定性,可能需要对某些接口进行限流。AOP 可以用来实现接口限流逻辑,将限流策略切入到接口调用处,从而控制接口的访问频率。
  5. 接口幂等性:幂等性是指对同一个操作的多次执行所产生的影响是相同的。在分布式系统中,为了保证接口的幂等性,可以使用 AOP 将幂等性校验逻辑切入到接口调用处,确保相同请求的多次执行不会产生重复的影响。
  6. 性能监控:通过 AOP,可以在方法调用前后插入性能监控逻辑,收集方法的执行时间、调用次数等性能指标,用于系统性能优化和监控。

参考文章

理解Spring的AOP和IOC实现原理 - 简书

面试被问了几百遍的 IoC 和 AOP ,还在傻傻搞不清楚? - 知乎

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值