IoC和AOP


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

这两个概念基本上是一个设计层的概念,主要讲的就是怎么去分离关注,用面向

对象的话说,就是怎么把职责进行分离。而这两个模式,我个人认为都有一个共

同点,就是变以前的主动为被动,而我认为,这种改变可能也是将来面向对象发

展的一个趋势。

首先说说什么叫主动。写过面向对象程序的人都知道,面向对象与面向过程的区

别就是,面向对象是由一大堆对象组成的,对象通过协作完成面向过程中的任务

。假设现在有对象A和B,那么当A需要使用B中的方法时,那么在A内部,就会有有

一个对B方法的调用,这种调用就称为主动调用。代码大概会如下:

public class A{

B b;

public void methodA(){

b.methodB();

}

}

这里为了下文解释方便,我增加了一个调用点的定义,调用点就是调用发生的地

方。也就是上面

b.methodB()中的b。

理解了什么叫主动之后,我想就先介绍什么叫IoC。IoC的全称这里就不说了,他

的字面意思就是控制反转。在上面的代码当中,由于A调用了B的方法,因此就形

成了一个A对B的依赖,这本身并没有什么问题。但是OO的思想是希望我们基于接

口编程,而不是基于实现编程。因此,系统设计将不止是原有的 A,B,而需要变

成IA,IB,A,B,其中IA,IB是接口,A,B是对应的实现类,然后为了使得A中现

在对B的实现依赖变成对接口的依赖,代码应该变成这样。

public class A implements IA{

IB b;

public void methodA(){

b.methodB();

}

}

这里虽然我们是基于接口编程了,但大家知道,在这中间,我们需要有一个步骤

把b指向一个IB的实现类B,这个怎么做,就是IoC要做的事情,这里就不细说了。

但简单来说,没有IoC,我们可能需要在A中通过某种方法去获取一个B的实例,但

有了IoC,她就能在A不参与的情况下,给我们一个B的实例,所以,IoC要做的就

是在调用点上从原来的主动生成一个调用点,变成被动的接受一个调用点。

接着就是AOP,全称也不说了,字面意思就是面向方面编程。举一个最普遍的例子

,就是如果我们代码需要做日志的话,那么在没有AOP的时候,我们的代码可能就

是这样:

public class A{

public void methodA(){

do log;

b.methodB();

}

}

这里methodA()中的做日志并不是方法本身的逻辑功能,而是一个附属功能,因此

,我们需要把它分离出去。怎么分离,就是AOP要做的事情,简单来说,就是系统

在调用者不知情的情况下,为我们的类A增加了一个代理类,她把我们的类A包装

了起来,像这样:

public class AP extends A{

A a;

public void methodA(){

do log;

a.methodA():

}

}

public class A{

public void methodA(){

b.methodB();

}

}

于是,当我们以为自己在调用A的methodA()方法时,实际调用的将是AP中的

methodA(),于是就可以把做日志的功能从原有的 methodA()中分离了出去。所以

,AOP要做的就是在用户不知道的情况下,将我们的调用点包裹了起来,从而把原

来的功能进行了分离。