动态代理和nanning AOP-2 
                                     用nanning来实现Introduction  
关键字:  AOP  Nanning   Dynamic proxy AOP 动态代理 
  
Introduction是AOP编程区别于OO编程的最大特点之一。最简单,直观地说Introduction就是为已经存在的类添加新的 字段,方法 等。 
在nanning中可以通过两种方法来实现Introduction: 
1、  使用xml配置文件 
2、  使用java代码 
使用动态代理实现的AOP有一些“限制”: 
1、  需要实现AOP功能的类,都必须定义接口,这是java动态代理的要求; 
2、  因为是对接口的AOP因此,Interception 和 Introduction 等只能对公用方法实现,不能对私有方法实现; 
3、  Nanning的AOP没有实现对属性字段这个级别的Interception。 
我们先看第2种方法的实现: 
  
代码如下: 
package tcftest; 
import com.tirsen.nanning.AspectInstance; 
import com.tirsen.nanning.Intf; 
import com.tirsen.nanning.IntfImpl; 
import com.tirsen.nanning.MixinInstance; 
import com.tirsen.nanning.NullInterceptor; 
import com.tirsen.nanning.definition.AspectClass; 
import com.tirsen.nanning.definition.AspectDefinition; 
public class IntroTest { 
    public static void main(String[] args) {   
       AspectClass aspectClass = new AspectClass(); 
       aspectClass.setInterface(Intf.class); 
       aspectClass.addInterceptor(MockInterceptor.class); 
       aspectClass.addInterceptor(NullInterceptor.class); 
        aspectClass.setTarget(IntfImpl.class); 
       AspectDefinition aspectDefinition = new AspectDefinition(); 
       aspectDefinition.setInterface(SideAspect.class); 
       aspectDefinition.addInterceptor(NullInterceptor.class); 
       aspectDefinition.addInterceptor(MockInterceptor.class); 
       aspectDefinition.setTarget(SideAspectImpl.class); 
       aspectClass.addAspect(aspectDefinition); 
       Object bigMomma1 = aspectClass.newInstance(); 
       ((Intf) bigMomma1).call(); 
       ((SideAspect) bigMomma1).sideCall(); 
    } 
com.tirsen.nanning.MixinInstance$InvocationImpl 
 call() 
com.tirsen.nanning.MixinInstance$InvocationImpl 
可以看到,通过aspectClass获得的对象可以实现Intf 和 SideAspect 两个接口,并完成调用各自实现的功能。 
上文的:Intf.class和SideAspect.class是借口 
        IntfImpl.class和SideAspectImpl.class是对接口的实现。 
大家可以自己实现自己的接口和类,来完成这个测试,代码就不粘贴在这里了。 
  
使用XML来实现Introduction的代码如下: 
1、  XML配置文件: 
<?xml version="1.0"?> 
<aspect-system> 
    <class name="tcftest.IPolo"> 
       <interceptor  
class="tcftest.MockInterceptor"  
scope="singleton" /> 
       <mixin  
interface="tcftest.IHelloWorld"  
target="tcftest.HelloWorldImpl" /> 
    </class> 
</aspect-system> 
2、  代码部分 
package tcftest; 
import java.io.IOException; 
import com.tirsen.nanning.AspectInstance; 
import com.tirsen.nanning.Aspects; 
import com.tirsen.nanning.config.AspectSystem; 
import com.tirsen.nanning.xml.AspectSystemParser; 
public class Polo implements IPolo { 
    public static void main(String[] args) throws IOException  { 
       AspectSystemParser aspectSystemParser  
= new AspectSystemParser(); 
       AspectSystem aspectSystem  
= aspectSystemParser.parse( 
                     Polo.class.getResource("nanning.xml")); 
       IPolo o =  
          (IPolo) aspectSystem.newInstance(IPolo.class);     
       AspectInstance instance  
              = Aspects.getAspectInstance(o);         
       IHelloWorld helloWorld  
                = (IHelloWorld) instance.getProxy(); 
       helloWorld.helloWorld();     
    } 
} 
运行效果如下: 
com.tirsen.nanning.MixinInstance$InvocationImpl 
HelloWorldImpl 's helloworld method 
  
因为Eclipse M8 有中文问题,所以输出全部用的英文。 
  
下文我们分析nanning的源代码来进一步了解AOP的实现过程。 
我的进步受益于:程序匠 的介绍。 
作者:田春峰 
专栏地址:http://www.csdn.net/develop/author/NetAuthor/accesine960/ 
  
   
 
  |