spring.net 框架分析(五)AOP实现

    在上一节,我们实现了一个简单的AOP示例,这一节我们分析一下AOP的具体实现。

   我们先看一下实现的代码:

            

  在这里helloProxy 并不是有new TestClass() 直接赋值,而是通过ProxyFactory 得到的。生成ProxyFactory 实例的时候,还要求用TestClass的示例作为参数。也就是说helloProxy 并不是简单的TestClass的一个实例。

  实际上helloProxy 是一个代理,它通过组合模式实现了ITestClass 接口,当然组合的也就是TestClass的实例,如下图所示:

tu501

 

在图中我们可以看出,但我们调用  helloProxy.aopTest()时,我们实际上调用的是TestClass的代理,而代理在调用实际的TestClass实例以前,会经过通知链,在调用完成后,还会经过通知链。

  那么AOP的实现上是建立实例的一个代理,然后在代理上实现通知链。关键就是如何实现代理。在Aop的源码中,有这样一段代码,这是DefaultAopProxyFactory中CreateAopProxy方法的一段


              

  这里有两种创建代理的方式DecoratorAopProxyTypeBuilder和CompositionAopProxyTypeBuilder,使用装饰模式和组合模式创建。

  当目标类继承至某个接口时会使用CompositionAopProxyTypeBuilder组合模式创建代理。当目标类继承某个类时会DecoratorAopProxyTypeBuilder装饰模式来创建代理。

而接下来的代码是创建代理

 

  而实际的创建代理是使用的System.Reflection.Emit命名空间下的类在运行时动态创建IL代码来生成AOP代理。这使得代理(的创建)非常高效,并且不受任何继承层次的限制。这种方法比使用ContextBoundObject类和Remoting更好。没有要求必须继承某个类和接口,更少侵入性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值