Spring

Spring(第二讲之静态代理和动态代理)

2020-06-01  本文已影响0人  superNeil

代理

代理是英文 Proxy 翻译过来的。我们在生活中见到过的代理,例如大部分微商 , 大概最常见的就是朋友圈中卖面膜的同学了。

她们从厂家拿货,然后在朋友圈中宣传,然后卖给熟人。 image-20200601210242276.png

按理说,顾客可以直接从厂家购买产品,但是现实生活中,很少有这样的销售模式。一般都是厂家委托给代理商进行销售,顾客跟代理商打交道,而不直接与产品实际生产者进行关联。

所以,代理就有一种中间人(中介)的味道。

接下来,我们说说软件中的代理模式。

静态代理

我们通过一条例子 来感受下 什么是静态代理 .

真实角色和代理角色 共同实现 接口 !

例如 :

真实角色 : You

代理角色 : 婚庆公司

实现相同的接口 : 结婚礼仪 .

public class StaticProxy {

    /**
     * 静态代理
     * 接口
     * 1.真实角色
     * 2.代理角色
     */
    public static void main(String[] args) {
        new WeddingCompany(new You()).happyMarry();
    }
}

//接口
interface Marry {
    void happyMarry();
}

//真实角色
class You implements Marry {
    @Override
    public void happyMarry() {
        System.out.println("我和嫦娥奔月了!");
    }
}

//代理角色
class WeddingCompany implements Marry {

    //真实角色  目标对象
    private Marry target;

    public WeddingCompany(Marry target) {
        this.target = target;
    }

    @Override
    public void happyMarry() {
        ready();
        this.target.happyMarry();
        after();
    }

    private void after() {
        System.out.println("结束");
    }

    private void ready() {
        System.out.println("忙前忙后");
    }
}

值得注意的是,代理类和被代理类应该共同实现一个接口,或者是共同继承某个类。

上面介绍的是静态代理的内容,为什么叫做静态呢?因为它的类型是事先预定好的,

****知道为什么要使用静态代理**
解决代码责任不分离的问题,但同样其也会带来,随着项目变大,业务类多的话,导致代理类太多**

动态代理

****知道为什么要使用动态代理**
不仅可以解决码责任不分离的问题,弥补静态代理的缺点
但同样有问题,API 不易使用,若用 Spring 的情况,配置过多**

使用 JDK 动态代理  代理类与真实类共同实现相同接口
使用 CGLIB 动态代理 代理类是继承真实类

总结

  1. 代理分为静态代理和动态代理两种。
  2. 静态代理,代理类需要自己编写代码写成。
  3. 动态代理,代理类通过 Proxy.newInstance() 方法生成。
  4. 不管是静态代理还是动态代理,代理与被代理者都要实现两样接口,它们的实质是面向接口编程。
  5. 静态代理和动态代理的区别是在于要不要开发者自己定义 Proxy 类。
  6. 动态代理通过 Proxy 动态生成 proxy class,但是它也指定了一个 InvocationHandler 的实现类。
  7. 代理模式本质上的目的是为了增强现有代码的功能。
上一篇 下一篇

猜你喜欢

热点阅读