Spring 的 IOC 和 AOP 简述

首先IOC和AOP并不是Spring提出的,早在Spring之前就已经存在了,不过更偏向理论化,而Spring在技术层面将这两个理论做了很好的实现。

什么是IOC

IoC: Inversion of Control (控制反转/反转控制),它是一个技术思想而不是一个技术实现,在Java开发领域他所描述的事情是对象的创建和管理的问题。
与传统开发方式相比在IOC的思想开发方式下,当类A需要以来类B时,我们不要自己去new对象了,而是由IOC容器帮我们实例化对象并且去管理它,我们需要什么对象直接从IOC容器中获取即可,由此我们可以省去创建和管理对象的一系列事情,也丧失了创建、管理对象的权力。
控制反转解释:
控制:指的是对象创建(实例化、管理)的权利
反转:控制权交给外部环境了(spring框架、IoC容器)
示例图:
Spring 的 IOC 和 AOP 简述_第1张图片

IOC解决了什么问题

IoC解决对象之间的耦合问题,例如当service层调用dao层时,传统方式下我们需要在service中new出dao层的具体实现类,这时当我们实现类需要改变时,service层也需要做相应的改变,这就造成了service层和dao层的强耦合。而使用IOC实例化对像时,我们只需要关注调用的dao层的接口,在service中声明接口属性,具体的实现类在IOC容器中进行切换,因此也不会产生对象中强耦合的情况。
示例图如下:
Spring 的 IOC 和 AOP 简述_第2张图片

IOC和DI的区别

IOC和DI(依赖注入)其实描述的都是对象实例化和依赖关系维护这同一件事情,只是角度不同。IOC是站在对象的角度,对象的实例化和管理交给了容器(反转);DI是站在容器的角度,容器会把对象所依赖的对象注入,例如A对象在实例化的过程中声明了B对象,那么容器就会把B对象注入给A。示例图如下:
Spring 的 IOC 和 AOP 简述_第3张图片

什么是AOP

AOP: Aspect oriented Programming ⾯向切⾯编程/⾯向⽅⾯编程,AOP是OOP的延续。
OOP的三大特征: 封装、继承和多态
opp思想是一种垂直纵向的继承体系,解决了代码开发中的大多数代码重复问题,例如当我们由三个类(pig、dog和cat),其中每个类中都有相同的方法(eat(); run();),那么未来避免代码重复,oop思想下我们就可以提取父类(animal),在父类中设置通用的属性(weight、height、eat(); run(); … …),让原有的类继承该类,这样子类中就可以不再重复写这些方法了,同样子类下的子类依然可以通过继承父类来避免代码的重复。示例图如下:
Spring 的 IOC 和 AOP 简述_第4张图片
但是当顶级父类(animal)中的多个方法中的相同位置出现重复代码时,如下图,OOP的思想就无法解决了。此时我们就需要用到AOP的思想了。
Spring 的 IOC 和 AOP 简述_第5张图片
首先解释此类重发代码被称为“横切逻辑代码”,即在多个纵向(顺序)流程中出现的多个相同子流程代码。
此类代码的使用场景通常有:事务控制、权限校验和打印日志中。

   横切逻辑代码存在什么问题:
   1、横切代码重复问题;
   2、横切逻辑代码和业务代码混杂在⼀起,代码臃肿,维护不⽅便。

AOP提出了横向抽取机制,将横切逻辑代码和业务逻辑代码分离,在不改变原有业务逻辑情况下,增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复。

解释为什么叫面向切面编程:

「切」:指的是横切逻辑,原有业务逻辑代码我们不能动,只能操作横切逻辑代码,所以⾯向横切逻辑;
「⾯」:横切逻辑代码往往要影响的是很多个⽅法,每⼀个⽅法都如同⼀个点,多个点构成⾯,有⼀个⾯的概念在⾥⾯。

你可能感兴趣的:(笔记,java,spring)