码迷,mamicode.com
首页 > 其他好文 > 详细

zbb20180930 代理模式 -静态代理-jdk动态代理-cglib动态代理

时间:2018-09-30 15:00:21      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:用处   ide   默认   print   利用反射   glib   param   面向   and   

CGLIB与JDK动态代理区别

区别:
java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换

代理模式

什么是代理?

通过代理控制对象的访问,可以详细访问某个对象的方法,在这个方法调用处理,或调用后处理。既(AOP微实现)  ,AOP核心技术面向切面编程。

技术分享图片

 

代理应用场景

安全代理 可以屏蔽真实角色

远程代理 远程调用代理类RMI

延迟加载 先加载轻量级代理类,真正需要在加载真实

代理的分类

静态代理(静态定义代理类)

动态代理(动态生成代理类)

Jdk自带动态代理

Cglib 、javaassist(字节码操作库)

静态代理

静态代理需要自己生成代理类

public class XiaoMing implements Hose {

     @Override

     public void mai() {

         System.out.println("我是小明,我要买房啦!!!!haha ");

     }

}

class Proxy  implements Hose {

     private XiaoMing xiaoMing;

     public Proxy(XiaoMing xiaoMing) {

         this.xiaoMing = xiaoMing;

     }

     public void mai() {

         System.out.println("我是中介 看你买房开始啦!");

         xiaoMing.mai();

         System.out.println("我是中介 看你买房结束啦!");

     }

     public static void main(String[] args) {

         Hose proxy = new Proxy(new XiaoMing());

         proxy.mai();

     }

}

 

JDK动态代理(不需要生成代理类)

实现InvocationHandler 就可以了。

public interface Hose {

 

    /**

     *

     * @methodDesc: 功能描述:(买房代理)

     * @author: 余胜军

     * @param:

     * @createTime:2017年8月27日 上午2:54:34

     * @returnType: void

     * @copyright:上海每特教育科技有限公司

     */

    public void mai();

 

}

 

 

public class XiaoMing implements Hose {

 

    @Override

    public void mai() {

        System.out.println("我是小明,我要买房啦!!!!haha ");

    }

 

}

 

public class JDKProxy implements InvocationHandler {

    private Object tarjet;

 

    public JDKProxy(Object tarjet) {

        this.tarjet = tarjet;

    }

 

    @Override

    public Object invoke(Object proxy, Method method, Object[] argsthrows Throwable {

        System.out.println("我是房产中介.....开始监听你买房啦!");

        Object oj = method.invoke(tarjetargs);

        System.out.println("我是房产中介.....结束监听你买房啦!");

        return oj;

 

    }

 

}

 

class Test222 {

    public static void main(String[] args) {

        XiaoMing xiaoMing = new XiaoMing();

        JDKProxy jdkProxy = new JDKProxy(xiaoMing);

        Hose hose=(Hose) Proxy.newProxyInstance(xiaoMing.getClass().getClassLoader(), xiaoMing.getClass().getInterfaces(), jdkProxy);

        hose.mai();

    }

 

}

 

CGLIB动态代理

实现

 

import java.lang.reflect.Method;

 

import net.sf.cglib.proxy.Enhancer;

import net.sf.cglib.proxy.MethodInterceptor;

import net.sf.cglib.proxy.MethodProxy;

 

public class Cglib implements MethodInterceptor {

 

     @Override

     public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxythrows Throwable {

         System.out.println("我是买房中介  开始监听你买房了....");

         Object invokeSuper = methodProxy.invokeSuper(oargs);

         System.out.println("我是买房中介  开结束你买房了....");

         return invokeSuper;

 

     }

 

}

 

class Test22222 {

     public static void main(String[] args) {

         Cglib cglib = new Cglib();

         Enhancer enhancer = new Enhancer();

         enhancer.setSuperclass(XiaoMing.class);

         enhancer.setCallback(cglib);

         Hose hose = (Hose) enhancer.create();

         hose.mai();

     }

}

 

 

CGLIB与JDK动态代理区别

区别:
java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换

zbb20180930 代理模式 -静态代理-jdk动态代理-cglib动态代理

标签:用处   ide   默认   print   利用反射   glib   param   面向   and   

原文地址:https://www.cnblogs.com/super-admin/p/9728827.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!