IOC AOP

1.什么是IOC?
2.IOC 解决了 什么问题?
3.IOC 和 DI 的 区别?

4.什么是 AOP?
5.AOP 解决了 什么 问题?
6.AOP 为什么 叫做 切面编程?


IOC---- 控制反转 / 反转控制。
是一种 思想 而不是 技术 实现的。
描述: java开发 领域对象的 创建 以及 管理问题。

如: 现有类 A 依赖于 类 B

传统的开发方式 :
往往 实在 类A 手动 通过 new 关键字 来 new 一个 B的对象 出来。

使用 IOC 思想 的 开发方式 :
不是 通过 new关键字 来创建 对象 , 而是 通过 IOC 容器(Spring框架)帮助我们 实例化对象 ,需要哪个对象 ,直接 从 IOC 容器里面 取即可。

这两种开发方式 :
我们 失去了 创建和管理对象的能力 ,从而 不用 在 考虑 对象的创建 管理等一系列的事。

** 为什么 叫 控制反转 ? **
控制 : 指的是 对象 的 创建和管理 的 权力。
反转: 指的是 控制权给外部环境 (Spring框架 IOC容器)

在这里插入图片描述

** IOC 解决了 什么问题 ? **
IOC 的 思想 就是 双方之间 不存在 依赖关系 ,而是 交由 第三方容器 管理相关资源。

  1. 对象之间 的 耦合性 减低。
  2. 资源 变得 易于管理。 (比如 使用Spring容器 很容易 实现 一个 单例)

例如:现有一个针对 User 的操作,利用 Service 和 Dao 两层结构进行开发
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

使用 IOC 思想的 话 ,我们将 对象 的 控制权 (创建 管理) 交给 IOC容器去管理, 需要的时候 直接 想 IOC 容器取即可。

在这里插入图片描述

** IOC 和 DI 的 区别 **

IOC 是一种 设计思想 或者说 某种 模式 。
设计思想 是 将 原本 在 程序中 手动创建对象的权利 , 交由 Spring框架 管理。

IOC 容器 是 Spring 用来 实现 IOC 的载体, IOC 容器 实际上 就是个 Map ,Map 中 存放 的 是 各种 对象。

IOC 中 最常见 和 最合理 的 实现方式 叫做 依赖注入 (DI)

** IOC 的 实现 **
控制反转(IOC),是一个概念,是一种思想。
指将传统上由程序代 码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。
控制反转就是对对象控制权的转移,从程序代码本身反转到了外部容器。通过容器实现对象的装配和管理。

IOC 是一个概念,是一种思想,其实现方式多种多样。
当前比较流行的实现方式是依赖 注入。应用广泛。

依赖:classA 类中含有 classB 的实例,在 classA 中调用 classB 的方法完成功能,即 classA 对 classB 有依赖。

依赖查找 : DL , 容器提供回调接口和上下文环境给组件。

依赖注入 : DI, 程序代码不做定位查询,这些工作由容器自 行完成。

**依赖注入 DI 是指程序运行过程中,若需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部容器,由外部容器创建后传递给程序。

Spring的依赖注入对调用者与被调用者几乎没有任何要求,完全支持 POJO 之间依赖关系的管理。

依赖注入是目前最优秀的解耦方式。依赖注入让 Spring 的 Bean 之间以配置文件的方式 组织在一起,而不是以硬编码的方式耦合在一起的。

Spring框架使用依赖注入(DI)实现IoC。

Spring容器是一个超级大工厂,负责创建、管理所有的Java对象,这些Java对象被称为Bean。
Spring容器管理着容器中Bean之间的依赖关系,Spring使用“依赖注入”的方式来管理Bean之间的依赖关系。使用IoC实现对象之间的解耦和。


** 什么 是 AOP **
AOP 是 面向切面编程。 是 OOP(面向对象编程) 的 一种延续

AOP 为什么 叫 面向 切面 编程?
切 :指的是横切逻辑,原有业务逻辑代码不动,只能操作横切逻辑代码,所以面向横切逻辑

面 :横切逻辑代码往往要影响的是很多个方法,每个方法如同一个点,多个点构成一个面。这里有一个面的概念

AOP 解决了什么问题
通过上面的分析可以发现,AOP 主要用来解决:在不改变原有业务逻辑的情况下,增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复。

面向切面编程(AOP),在面向对象编程(oop)思想中,我们将事物纵向抽成一个个的对象。
而在面向切面编程中,我们将一个个的对象某些类似的方面横向抽成一个切面,对这个切面进行一些如权限控制、事物管理,记录日志等公用操作处理的过程就是面向切面编程的思想。
AOP底层是动态代理,如果是接口采用JDK动态代理,如果是类采用CGLIB方式实现动态代理

AOP编程术语
● 切面(Aspect)

切面泛指交叉业务逻辑。上例中的事务处理、日志处理就可以理解为切面。常用的切面是通知(Advice)。实际就是对主业务逻辑的一种增强。

● 织入(Weaving)

织入是指将切面代码插入到目标对象的过程。上例中MyInvocationHandler类中的invoke() 方法完成的工作,就可以称为织入。

● 连接点(JoinPoint)

连接点指可以被切面织入的具体方法。通常业务接口中的方法均为连接点。

● 切入点(Pointcut)

切入点指声明的一个或多个连接点的集合。通过切入点指定一组方法。

被标记为 final 的方法是不能作为连接点与切入点的。因为最终的是不能被修改的,不能被增强的。

● 目标对象(Target)

目标对象指将要被增强的对象。即包含主业务逻辑的类的对象。上例中的StudentServiceImpl的对象若被增强,则该类称为目标类,该类对象称为目标对象。当然,不被增强,也就无所谓目标不目标了。

● 通知(Advice)

通知是切面的一种实现,可以完成简单织入功能(织入功能就是在这里完成的)。上例中的 MyInvocationHandler 就可以理解为是一种通知。换个角度来说,通知定义了增强代码切入到目标代码的时间点,是目标方法执行之前执行,还是之后执行等。通知类型不同,切入时间不同。 切入点定义切入的位置,通知定义切入的时间。

● 代理(Proxying)
代理是通知目标对象后创建的对象。从客户端的角度看,代理对象和目标对象是一样的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值