spring的动态代理有几种实现方式

 我来答
ifeilong
2016-09-17 · TA获得超过8068个赞
知道大有可为答主
回答量:1187
采纳率:100%
帮助的人:779万
展开全部

JAVA 代理实现

代理的实现分动态代理和静态代理,静态代理的实现是对已经生成了的JAVA类进行封装。

动态代理则是在运行时生成了相关代理累,在JAVA中生成动态代理一般有两种方式。


JDK自带实现方法

JDK实现代理生成,是用类 java.lang.reflect.Proxy, 实现方式如下

EX:

public class JDKProxy {
      public static Object getPoxyObject(final Object c) {
            return Proxy.newProxyInstance(c.getClass().getClassLoader(), c.getClass().getInterfaces(),// JDK实现动态代理,但JDK实现必须需要接口
                        new InvocationHandler() {
                             public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                                    // TODO Auto-generated method stub
                                    Object reObj = null;
                                    System.out.print("you say: ");
                                    reObj = method.invoke(c, args);
                                    System.out.println(" [" + Calendar.getInstance().get(Calendar.HOUR) + ":"
                                                + Calendar.getInstance().get(Calendar.MINUTE) + " "
                                                + Calendar.getInstance().get(Calendar.SECOND) + "]");
                                    return reObj;
                              }
                        });
      }
}

测试代理类方法

public class TestForPoxy {
      public static void main(String[] args) {
            ServiceTest service = new ServiceTestImpl();
            System.out.println(service.getClass().getSimpleName());
            ServiceTest poxyService = (ServiceTest) JDKProxy.getPoxyObject(service);
            System.out.println(poxyService.getClass().getSuperclass());
            poxyService.saySomething("hello,My QQ code is 107966750.");
            poxyService.saySomething("what 's your name?");
            poxyService.saySomething("only for test,hehe.");
      }
}

1, Proxy实现代理的目标类必须有实现接口

2, 生成出来的代理类为接口实现类,和目标类不能进行转换,只能转为接口实现类进行调用

明显特点:通过此方法生成出来的类名叫做 $Proxy0


用CGLIB包实现

CGLIB是一个开源项目,官方网址是:http://cglib.sourceforge.net/,可以去上面下载最新JAR包,

本项目用的是cglib-3.0.jar

本项目还加入了依赖JAR包asm-4.0.jar,asm-util-4.0.jar

实现方式如下

EX:

public class CGLIBProxy {
      public static Object getPoxyObject(Object c) {
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(c.getClass());
            enhancer.setCallback(new MethodInterceptor() {
                  public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy proxy) throws Throwable {
                        System.out.print("you say: ");
                        proxy.invokeSuper(arg0, arg2);
                        System.out.println(" [" + Calendar.getInstance().get(Calendar.HOUR) + ":"
                                    + Calendar.getInstance().get(Calendar.MINUTE) + " " + Calendar.getInstance().get(Calendar.SECOND)
                                    + "]");
                        return null;
                  }
            });
            return enhancer.create();
      }
}

测试代理类方法

public class TestForPoxy {
      public static void main(String[] args) {
            ServiceTest service = new ServiceTestImpl();
            System.out.println(service.getClass().getSimpleName());
//          ServiceTest poxyService = (ServiceTest) JDKProxy.getPoxyObject(service);
            ServiceTest poxyService = (ServiceTest) CGLIBProxy.getPoxyObject(service);
            System.out.println(poxyService.getClass().getSuperclass());
            poxyService.saySomething("hello,My QQ code is 107966750.");
            poxyService.saySomething("what 's your name?");
            poxyService.saySomething("only for test,hehe.");
      }
}

 

1, CGLIB实现方式是对代理的目标类进行继承

2, 生成出了的代理类可以没方法,生成出来的类可以直接转换成目标类或目标类实现接口的实现类,因JAVA向上转换

明显特点:通过输出看出,看出生成出的代理类的parent类为代理的目标类

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式