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

初识代理——Proxy

时间:2019-08-08 13:00:46      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:spring   动态   info   企业   代理类   imp   设计   class   需要   

无处不在的模式——Proxy

       最近在看《设计模式之禅》,看到代理模式这一章的时候,发现自己在写spring项目的时候其实很多时候都用到了代理,无论是依赖注入、AOP还是其他,可以说是无处不在。

于是自己便自己摸索写了一些小例子,当然也参考了网上其他博主的博客,毕竟小白一枚hhhhhh

进入正题:

                            技术图片

     图1-1:代理Proxy

 

 

代理模式现在主流的有两大类:1、JDK代理    2、CGLB代理

(JDK静态代理就不说了,网上很多都有,主要我觉得现在面向企业项目,静态代理局限性有点大,对于我而言可能就只是去了解了一下,而并没有说想要去深入这个)

 

Th1:JDK动态接口代理(需要实现InvocationHandler接口中的invoke(...)方法,必须实现某个接口)

public class MyJdkProxy implements InvocationHandler {

    // 目标对象
    public Object target;

    // 初始化传入代理对象
    public MyJdkProxy(Object target){
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("xsc");
        return method.invoke(target,args);
    }

    public Object newProxy(){
        // 获取代理目标对象实例
        return Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                this
        );
    }
}

 

Th2:CGLB动态接口代理(需要实现MethodInterceptor接口中的intercept(...)方法,当然也可无需实现接口,可直接代理类)

public class MyCgljProxy implements MethodInterceptor {

    // 目标对象
    public Object target;

    // 初始化传入代理对象
    public MyCgljProxy(Object target){
        this.target = target;
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("cj");
        return methodProxy.invoke(target,objects);
    }

    public Object newProxy(){
        // 获取代理目标对象实例
        return Enhancer.create(target.getClass(),this);
    }
}

 

Th3:测试类Test.java

public class Test{
    // 需要代理的接口
    interface Subject{
        void sayHi();
        void sayHallo();
    }

    // 代理接口实现类
    static class SubjectImpl implements Subject{

        @Override
        public void sayHi() {
            System.out.println("Hi");
        }

        @Override
        public void sayHallo() {
            System.out.println("Hello");
        }
    }


    public static void main(String[] args) {
        // JDK动态接口代理方式
        Subject target1 = new SubjectImpl();
        MyJdkProxy proxy = new MyJdkProxy(target1);
        target1 = (Subject) proxy.newProxy();

        target1.sayHallo();
        target1.sayHi();

        System.out.println("----------------------------");

        // CGLB动态接口代理方式
        Subject target2 = new SubjectImpl();
        MyCgljProxy myCgljProxy = new MyCgljProxy(target2);
        target2 = (Subject) myCgljProxy.newProxy();
        target2.sayHi();
        target2.sayHallo();
    }
}

 

Th4:测试结果

技术图片

 

总结:

当然这些只是简单的代理,感觉其实一通百通,目的都是为对象提供个代理来控制对其的访问,而我们的代理类则委托预处理、过滤、转发消息,以及委托后进行的后续处理,解决了在直接访问对象时可能带来的问题

 

革命尚未成功,同志仍需努力~~~~

 

初识代理——Proxy

标签:spring   动态   info   企业   代理类   imp   设计   class   需要   

原文地址:https://www.cnblogs.com/xscc/p/11320473.html

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