架构探险-java代理技术通俗理解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:代理是理解Spring容器重要的途径,但是代理模式的核心就是去复杂的部分,

将我们不关心的、共同的部分提到一个公共的部分。

这个公共部分由其特点分为JDK代理、CGlib代理


提示:以下是本篇文章正文内容,下面案例可供参考

一、代理应用场景?

代理的应用场景体现在一种统一的思想,何为统一的思想,就是复杂的事交给专业的人去做。就像你通讯录中只需保存修理工-小王,装修工-小张。那么家里的修理、装修的事情你就啥都不用问了,只需要按一下电话按钮。同时,你当然可以将联系方式推荐给你自己的同事或朋友。

二、java代理

代理这个东西也是分类的,简单的说

   1. 静态代理 
   2. 动态代理
   3. cglib代理

静态代理

 /**
 * 买房子的中介
 */
public class Proxy implements Rent{

    Rent rent = new Host();
    @Override
    public void Rent() {
        System.out.println("把房源信息挂在网站中,打电话,找买家,谈好价格");
        rent.Rent();
        System.out.println("跟踪资金走向");
    }
}
public class Client {
    public static void main(String[] args) {
       Rent hostRent = new Proxy();
       hostRent.Rent();
    }
}

这种方式的缺点是代码中将会充满xxxProxy类,这就很恶心。

动态代理

public class ProxyHandler implements InvocationHandler {
    // 要代理的类
    private Object object;
    // 构造函数中将要代理的类请进来
    public ProxyHandler(Object object){
        this.object = object;
    }
    
    @Override
    public Object invoke(Object o, Method method, Object[] objects) throws Throwable {

        System.out.println("开始代理");
        method.invoke(object,objects);
        System.out.println("结束代理");
        return null;
    }
}
    public static void main(String[] args) {
        // 要被代理的类来了
        Rent rent = new Host();
        // 被代理的类找到了代理类
        InvocationHandler handler = new ProxyHandler(rent);
        // 告诉代理类“加载器、接口方法、被代理类
        Rent rentProxy = (Rent)Proxy.newProxyInstance(rent.getClass().getClassLoader(), rent.getClass().getInterfaces(), handler);
        rentProxy.rent();
    }

很明显,卖房子不好卖了,是不是可以只要“开始代理、结束代理”就可以依然可以使用该代理类,啥都不用改,但是这里存在一个问题是,抽象层方面必需是接口

CGLIB代理实现

public class ProxyHandler implements MethodInterceptor {
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("开始代理");
        methodProxy.invokeSuper(o,objects);
        System.out.println("结束代理");
        return null;
    }
}
public class CglibClient {
    public static void main(String[] args) {

        // 增强类
        Enhancer enhancer = new Enhancer();
        // 房东揉进来
        enhancer.setSuperclass(Host.class);
        // 中介进行代理
        enhancer.setCallback(new ProxyHandler());
        // 开始工作喽
        Host proxyHost = (Host) enhancer.create();
        proxyHost.rent();
    }
}

在这里注意ASM与jdk的版本问题。这个是Spring用的最多的一种,所以要注意

3.java代理与spring AOP的关系

其实Spring容器的AOP实际使用CGlib的动态代理。

总结

提示:这里仅仅是简单的介绍,要结合Spring AOP的源代码来理解,才可以。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值