动态代理和nanning AOP(1)

原创 2004年04月28日 22:46:00

            动态代理和nanning AOP

                                     

关键字:  AOP  Nanning   Dynamic proxy AOP 动态代理

大家知道AOP编程目前有三种途径:

1、               类似AspectJ,使用特定的语法将代码插入到相应代码中的过程,一般是编译完成在编译时修改java类代码实现,interception and introduct 等,;

2、               类似 JbossAOP ,在类加载时利用反射机制实现AOP的功能;

3、               类似nanning(南宁)使用java 动态代理。

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

动态代理的定义如下:

http://java.sun.com/j2se/1.3/docs/guide/reflection/proxy.html

A dynamic proxy class is a class that implements a list of interfaces specified at runtime such that a method invocation through one of the interfaces on an instance of the class will be encoded and dispatched to another object through a uniform interface.

也就是说要用动态代理,那么一个类的行为需要实现统一的一个或多个接口才能实现,当这个类实例的方法被调用的时候,可以对之进行一些拦截处理。

举例如下:

接口类:

public interface Foo {

     Object bar(Object obj) throws BazException;

}

实现类:

public class FooImple implements Foo {

    public Object bar(Object obj) throws BazException {

       return obj;

        // ...

    }

}

动态代理类的实现:

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

public class DebugProxy implements java.lang.reflect.InvocationHandler {

    private Object obj;

    public static Object newInstance(Object obj) {

       return java.lang.reflect.Proxy.newProxyInstance(obj.getClass()

              .getClassLoader(), obj.getClass().getInterfaces(),

              new DebugProxy(obj));

    }

    private DebugProxy(Object obj) {

       this.obj = obj;

    }

    public Object invoke(Object proxy, Method m, Object[] args)

           throws Throwable {

       Object result;

       try {

           System.out.println("before method " + m.getName());

           result = m.invoke(obj, args);

       } catch (InvocationTargetException e) {

           throw e.getTargetException();

       } catch (Exception e) {

           throw new RuntimeException("unexpected invocation exception: "

                  + e.getMessage());

       } finally {

           System.out.println("after method " + m.getName());

       }

       return result;

    }

}

测试类:

public class test { 

    public static void main(String[] args) throws BazException {

       Foo foo = (Foo) DebugProxy.newInstance(new FooImple());

       foo.bar(null);

    }

}

运行效果如下:

before method bar

after method bar

 

可以看到:执行     foo.bar(null); 的时候,动态代理实现了对这个方法调用前和调用后的拦截。

 

方法拦截 interception AOP的特点之一。

       基于动态代理的AOP实现一般是轻量级AOP Framewrok的首选,比如:nanning springframework

    下文我们介绍nanning aop 的实现。

 

参考资料

http://www.csdn.net/develop/article/24/24445.shtm

 

作者:田春峰

专栏地址:http://www.csdn.net/develop/author/NetAuthor/accesine960/

 

版权声明:本文为博主原创文章,在不删除、修改文章内容的情况下,可以自由转载。

动态代理(2)----动态代理和AOP

根据前面介绍的Proxy和InvocationHandler,实在很难看出这种动态代理的优势,下面介绍一种更实用的动态代理机制.只要我们开发一个实际使用的软件系统,总会出现相同代码重复出现的情形,在这...
  • beijiguangyong
  • beijiguangyong
  • 2013年02月28日 22:09
  • 4071

AOP和动态代理的理解 [仅供参考]

AOP实现机制和代理
  • session_Time
  • session_Time
  • 2016年09月21日 08:11
  • 624

AOP实现原理——动态代理

前几天阿里面试问AOP是怎么实现的,感觉自己当时答的不好,于是回来重新研究了一下,找了下资料,现在来做个分享.       Spring两大核心IOC与AOP.IOC负责将对象动态的注入到容器,让容...
  • KevinDai007
  • KevinDai007
  • 2016年03月31日 17:52
  • 1037

Spring AOP的实现——动态代理机制

在java的动态代理中,有两个重要的类或者接口,一个是InvocationHandler(Interface)、另一个是Proxy(Class),这一个类和接口是实现动态代理所必须的。 Invocat...
  • bingogirl
  • bingogirl
  • 2016年08月29日 21:15
  • 6102

AOP之静态代理VS动态代理

一、代理概念         为某个对象提供一个代理,以控制对这个对象的访问。代理类和委托类有共同的父类或父接口,代理类负责请求的预处理,过滤,将请求分配给委托类处理。 二、静态代理:        ...
  • u010097777
  • u010097777
  • 2016年06月06日 21:37
  • 1902

JAVA的动态代理模式分析以及与spring AOP的比较

本文是结合《轻量级Java EE企业应用实战(李刚)》这本书以及个人的一点理解写的,记录下来以作学习之用。 1.代理就是一个java对象代表另一个java对象来采取行动。为什么需要采用代理呢?很简单...
  • yyzyyx
  • yyzyyx
  • 2016年05月25日 16:43
  • 790

AOP源码解析(一)实现动态代理

动态AOP使用示例 面向对象编程有一些弊端,当需要为多个不具有继承关系的对象引入同一个公共行为时,例如日志,安全检测等,我们只有在每个对象里引入公共行为,这样程序中就产生了大量的重复代码,所以有了面...
  • u012291108
  • u012291108
  • 2016年10月30日 23:27
  • 1226

spring实现AOP的两种方式以及实现动态代理方式

AOP: 方式一:Annatation 注解方式 1、spring依赖库  * SPRING_HOME/dist/spring.jar  * SPRING_HOME/lib/jakar...
  • shangzhiliang_2008
  • shangzhiliang_2008
  • 2015年08月30日 11:30
  • 2355

Spring AOP实践(一)动态代理和静态代理,为什么使用AOP

作为Spring仅次于IOC的第二大代表功能,AOP的应用就不是很广泛了。众所周知AOP是面向方面编程,是对面向对象编程做出补充的一种编程方式。AOP使得编程人员可以把分散在代码各个地方的相同功能抽象...
  • nokiaisacat
  • nokiaisacat
  • 2016年08月22日 20:39
  • 1988

AOP的底层实现-CGLIB动态代理和JDK动态代理

详细介绍了AOP的核心功能(拦截功能)在底层是如何实现的;介绍了两种实现AOP的动态代理:jdk动态代理和cglib动态代理,并详细描述了它们在代码层面的实现。...
  • dreamrealised
  • dreamrealised
  • 2013年10月20日 19:53
  • 28302
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:动态代理和nanning AOP(1)
举报原因:
原因补充:

(最多只允许输入30个字)