java代理
发布日期:2022-02-17 02:39:53 浏览次数:30 分类:技术文章

本文共 4208 字,大约阅读时间需要 14 分钟。

何为代理 为什么要使用java代理

代理在spring中是非常重要的一种设计模式,他是面向切面编程之所以能实现的的重要设计方法。

那我们为什么要实现代理呢!这就是java中很重要的一种编程思想,低耦合,并且面对对象。
比如我现在敲了很久的代码,实在不行了,今天憋不住了,我要解开我的洪荒之力,我要去dust2里面去剿匪!
但是一局游戏吧!不能只有我一个人吧!我可不想缴电脑的大猪。于是我想和其他老六一起打游戏。但是我不想知道这些人是怎么和我匹配上的,我是个懒狗,就像打游戏!我一点不想知道这个弱智的匹配机制是怎么运行的,这时候就需要代理来替我实现。
我找到代理的接口,告诉他我想剿匪了,他就会替我去匹配一些老六,帮我把打游戏用的服务器给我准备好。。。。然后直接让我打上游戏。

在这里插入图片描述在这里插入图片描述

静态代理

public interface BuyHouse {    void buyHouse();}
public class BuyHouseImpl implements BuyHouse{    @Override    public void buyHouse() {        System.out.println("我想买房子");    }}
public class BuyHouseProxy implements BuyHouse{    BuyHouse buyHouse = new BuyHouseImpl();    BuyHouseProxy(final BuyHouse buyHouse){        this.buyHouse=buyHouse;    }    @Override    public void buyHouse() {        System.out.println("买房前");        buyHouse.buyHouse();        System.out.println("买房后");    }}
public class ProxyTest {    public static void main(String[] args) {        BuyHouse buyHouse =new BuyHouseImpl();        BuyHouse buyHouse1 = new BuyHouseProxy(buyHouse);        buyHouse1.buyHouse();    }}

打游戏打完了,我突然一拍大腿,我得买一套房,于是我就搞了一个代理替我实现买房,但是显而易见这种静态代理虽然打起来,用起来都非常简单,但是却有一个致命的问题,我又不想买房了(作为一个后端程序员,压根买不起)我想做其他没又意义的事情,但是我突然发现我写的这个静态代理,他只能帮我买房,简直太离谱了。那我就会想我要实现一个有普遍意义的代理,我要让他当我的保姆(工具人)我只用给他下达命令,他怎么实现我就不想管了。

动态代理

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class ProxyFactory {    private Object target;    public ProxyFactory(Object target){        this.target = target;    }    public Object getProxyInstance(){        return Proxy.newProxyInstance(                target.getClass().getClassLoader(),                target.getClass().getInterfaces(),                new InvocationHandler() {                    @Override                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {                        System.out.println("开始事务2");                        Object returnValue = method.invoke(target ,args);                        System.out.println("提交事务2");                        return   returnValue;                    }                }        );    }}
public class App {    public static void main(String[] args) {        IUserDao target = new UserDao();        BuyHouse target1 = new BuyHouseImpl();        System.out.println(target.getClass());        System.out.println(target1.getClass());        IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();        BuyHouse proxy1 = (BuyHouse) new ProxyFactory(target1).getProxyInstance();        System.out.println(proxy.getClass());        proxy.save();        proxy1.buyHouse();    }}

我通过写了一个动态代理的工厂,他专门替我做事,每一次我只需通过构造器,将我想要实现的对象告诉他,他就会去帮我做事,至于要怎么实现,我只用去改他的invoke就能实现 至于这个代码就得实现InvocationHandler接口,并且将他的类和接口将在进来,这样我就实现了动态并且有一种黑箱的感觉,只有当你把对象放进来的时候,我才知道我要去实现那个方法,这种方式就完全能唯我独尊,工具人执行的都是主人的任务罢了,他并不能知道主人之前怎么想的。

cglib代理

import org.springframework.cglib.proxy.Enhancer;import org.springframework.cglib.proxy.MethodInterceptor;import org.springframework.cglib.proxy.MethodProxy;import java.lang.reflect.Method;public class ProxyFactoryCglib implements MethodInterceptor {    private Object target;    public ProxyFactoryCglib(Object target){        this.target = target;    }    public Object getProxyInstance(){        Enhancer en = new Enhancer();        en.setSuperclass(target.getClass());        en.setCallback(this);        System.out.println();        return  en.create();    }    @Override    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {        System.out.println("开始事务...");        Object returnValue = methodProxy.invoke(target,args);        System.out.println("结束事务...");        return returnValue;    }}

说了那么多 有的人就要问了 那我为了实现个代理,就必须要实现接口,作为倔强并且叛逆的坏宝宝,老子就不听你话,我就没有接口,我看你拿我怎么办!!!这时候java怪蜀黍直接从裤兜里掏出了他的法宝————cglib代理。通过methodintercept拦截器,我拦截到你要使用的方法,并且使用我独特的奇淫技巧把他实现给你。而为了实现这种,我们有没有接口,那我就会想到使用继承来实现代理,我将原本对象的类设置为父类,我通过这个设置的这个父类的子类来代理实现,(其实接口和继承有些东西很相似,我既然没有接口,我就把你变成我的父亲(打不过你,我就加入你))作为子类,然后通过一个回调函数。至于回调函数简单来说就是我写了一个接口(但是我不知道我这个接口想实现什么方法,或则我已经写了方法我想给这个方法加点其他功能,但是我现在又没有想好),于是我写一个类A,我在这个类中预留一个回调接口,然后当我写类B时,我就可以接上我刚才的接口,然后重写那个方法。再通过实例一个A对象,就能通过预留的接口调用接了接口的B(多态的思想)从而实现了我想实现的方法。当然也可以是用内部类重写该方法然后调用!(更加方便)。然后我们创建出该子类就可像动态代理实现

转载地址:https://blog.csdn.net/qq_39814938/article/details/108456878 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:JDBC连接的进化
下一篇:前缀表达式、中缀表达式、后缀表达式

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月01日 07时30分37秒