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 动态代理 代理类是继承真实类
总结
- 代理分为静态代理和动态代理两种。
- 静态代理,代理类需要自己编写代码写成。
- 动态代理,代理类通过 Proxy.newInstance() 方法生成。
- 不管是静态代理还是动态代理,代理与被代理者都要实现两样接口,它们的实质是面向接口编程。
- 静态代理和动态代理的区别是在于要不要开发者自己定义 Proxy 类。
- 动态代理通过 Proxy 动态生成 proxy class,但是它也指定了一个 InvocationHandler 的实现类。
- 代理模式本质上的目的是为了增强现有代码的功能。