浅谈Spring中涉及的IoC,DI,AOP概念

浅谈Spring中涉及的IoC,DI,AOP概念

Spring是一个非常庞大的framework,笔者在这篇博文中不会涉及过多除了这三个概念之外内容。只着重于将一讲IOC,DI,AOP

IOC

Inversion of Control(IOC)控制反转,这个概念可以和OOP中对象的控制结合起来看。我们在OOP中一般而言在方法中new一个对象实例的行为就是正向控制,那么如果我们不直接在方法中控制一个对象,而是由一个container来代为控制,相当于我们把控制权交给了Spring,这个行为就是控制反转。

DI

Dependency Injection是在OOP上的概念,依赖注入,由于使用了IOC我们不直接控制对象,那么我们应该如果把需要依赖的对象提供给被依赖的对象呢?这是使用注入的方法,通过Spring对Bean的控制,注入Bean中需要依赖的对象。全程我们都不需要自行手动的控制(显示的在代码上声明依赖)

举一个例子:如果a对象内部有一个b对象,那么之前我们会显示的在创建a对象的时候把b对象引用给a对象。当我们使用Spring时,我们只需要在配置上声明a对象有一个b对象的依赖,那么Spring就会自动注入b对象。

这里有一个问题,如果a对象内部有一个b对象的引用,同时b对象内部也有一个a对象的引用,Spring是如何解决的呢?

这里Spring使用了三级cache的方法,第一级缓存存放已经初始化好的对象实例,第二级缓存存放bean对象,但是内部的属性还没有被填充,第三级缓存存放BeanFactory实例,用于解决循环依赖的问题。

这样上述的问题可以通过以下的流程来解决:

  1. 创建a实例Bean,先调用它的BeanFactory,发现需要实例b,先将其放入三级缓存中,然后创建实例b
  2. 创建实例b的过程中,会在一,二,三级缓存中查询是否有关于实例a的对象,在三级缓存中发现有关于实例A的factory对象,把A放入二级缓存中,并把它赋予b中的引用。并把B放入一级缓存;
  3. 接着回来创建a实例,把放入一级缓存的b实例给a引用。将a放入一级缓存中。这样可以解决循环依赖的问题。

AOP

AOP的概念最好可以与OOP的概念一起来理解。在OOP中,我们把一些共性的逻辑抽象出来生成其他逻辑外的一个父类,然后每个不同的子类型只需要继承这个父类,就可以一起调用相同部分的逻辑。但是有时候一个方法内部,如果有相同的逻辑,我们怎么把他抽象出来呢?换句话说,OOP中的基本单元是类,AOP中基本单元就是Aspect,我们把一个方法切成多个Aspect,每个Aspect有不同的逻辑,这样多个相同的逻辑可以横向抽象为一个切片,这就是AOP的好处。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!