初识代理——Proxy

Posted xscc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识代理——Proxy相关的知识,希望对你有一定的参考价值。

无处不在的模式——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的主要内容,如果未能解决你的问题,请参考以下文章

【proxy】Linux上各类代理设置

代理与反向代理 (proxy vs reverse proxy)

vue配置反向代理 devServer配置proxy

代理模式(Proxy)

代理模式-Proxy

代理模式(Proxy Pattern)