前言

Spring 是一个开源的轻量级的企业级框架,其核心是反转控制 (IoC) 和面向切面 (AOP) 的容器框架。本文我们来了解下IOC和AOP的原理。

IOC

IOC (Inversion of Control )(控制反转/反转控制),注意它是⼀个技术思想,不是⼀个技术实现。

描述的事情: Java开发领域对象的创建,管理的问题

传统开发方式:比如类A依赖于类B,往往会在类A中new⼀个B的对象

IoC思想下开发方式:我们不用自己去new对象了,而是由IoC容器(Spring框架)去帮助我们实例化对 象并且管理它,我们需要使⽤哪个对象,去问IoC容器要即可

总结为一句话,与传统的开发方式相比,在ioc思想下开发,我们丧失了⼀个权利(创建、管理对象的权利),得到了⼀个福利(不⽤考虑对象的创建、管理等⼀系列事情)

为什么叫做控制反转

控制:指的是对象创建(实例化、管理)的权利

反转:控制权交给外部环境了(spring框架、 IoC容器)

如下图所示:

伴随着IOC的,还有个DI常被人同时提起,DI又是什么呢?

DI: Dependancy Injection(依赖注入)

IOC和DI的关系如下图所示:

总结:IOC和DI描述的是同⼀件事情,只不过角度不⼀样罢了 。

AOP

AOP: Aspect oriented Programming 面向切面编程/面向方面编程 AOP是OOP的延续,我们从OOP(Object Oriented Programming)即面向对象编程说起 。

OOP的三大特征:封装继承多态。 OOP是⼀种垂直继承体系,举例如下图所示,一目了然:

OOP编程思想可以解决大多数的代码重复问题,但是有⼀些情况是处理不了的,比如下面的在顶级父类 Animal中的多个方法中相同位置出现了重复代码, OOP就解决不了 :

多个方法中出现了重复的代码,我们将这些重复的代码称为横切逻辑代码,如下图:

横切逻辑代码存在很大的问题:

  1. 横切代码重复问题
  2. 横切逻辑代码和业务代码混杂在⼀起,代码臃肿,维护不方便

如何解决这个问题呢?

轮到AOP出场了, AOP独辟蹊径提出横向抽取机制,将横切逻辑代码和业务逻辑代码分离,如下图所示:

问题来了,代码拆分容易,那么如何在不改变原有业务逻辑的情况下,悄无声息的把横切逻辑代码应用到原有的业 务逻辑中,达到和原来⼀样的效果,这个是比较难的。这个就靠spring对aop的底层实现来解决了。

为什么叫做面向切面编程?

「切」:指的是横切逻辑,原有业务逻辑代码我们不能动,只能操作横切逻辑代码,所以面向横切逻辑

「面」:横切逻辑代码往往要影响的是很多个方法,每⼀个方法都如同⼀个点,多个点构成面,有一个面的概念在里面.

总而言之,AOP的核心思想就是在不改变原有业务逻辑情况下,增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复。

总结

IOC:控制反转,又叫依赖注入,将对象的创建及管理交由spring容器,我们不用去手动创建销毁对象;

AOP:面向切面编程,将大量重复的横切逻辑代码从业务逻辑代码中抽离出来,减少耦合。