在上一节,我们实现了一个简单的AOP示例,这一节我们分析一下AOP的具体实现。
我们先看一下实现的代码:
在这里helloProxy 并不是有new TestClass() 直接赋值,而是通过ProxyFactory 得到的。生成ProxyFactory 实例的时候,还要求用TestClass的示例作为参数。也就是说helloProxy 并不是简单的TestClass的一个实例。
实际上helloProxy 是一个代理,它通过组合模式实现了ITestClass 接口,当然组合的也就是TestClass的实例,如下图所示:
在图中我们可以看出,但我们调用 helloProxy.aopTest()时,我们实际上调用的是TestClass的代理,而代理在调用实际的TestClass实例以前,会经过通知链,在调用完成后,还会经过通知链。
那么AOP的实现上是建立实例的一个代理,然后在代理上实现通知链。关键就是如何实现代理。在Aop的源码中,有这样一段代码,这是DefaultAopProxyFactory中CreateAopProxy方法的一段
这里有两种创建代理的方式DecoratorAopProxyTypeBuilder和CompositionAopProxyTypeBuilder,使用装饰模式和组合模式创建。
当目标类继承至某个接口时会使用CompositionAopProxyTypeBuilder组合模式创建代理。当目标类继承某个类时会DecoratorAopProxyTypeBuilder装饰模式来创建代理。
而接下来的代码是创建代理
而实际的创建代理是使用的System.Reflection.Emit命名空间下的类在运行时动态创建IL代码来生成AOP代理。这使得代理(的创建)非常高效,并且不受任何继承层次的限制。这种方法比使用ContextBoundObject类和Remoting更好。没有要求必须继承某个类和接口,更少侵入性。