一、静态代理
1、静态代理引入
代理模式在我们生活中很常见,比如我们购物,可以从生产工厂直接进行购物,但是在生活中往往不是这样,一般都是厂家委托给超市进行销售,而我们不直接跟厂家进行关联,这其中就引用了静态代理的思想,厂家相当于真实角色,超市相当于代理角色,我们则是目标角色。代理角色的作用其实就是,帮助真实角色完成一些事情,在真实角色业务的前提下,还可以增加其他的业务。AOP切面编程就是运用到了这一思想。
2、静态代理案例
写一个小小的案例,通过婚庆公司,来实现静态代理
对于Java中的Thread底层就使用的静态代理模式,源码分析
当我们开启一个线程,其实就是定义了一个真实角色实现了Runnable接口,重写了run方法。
二、动态代理
1、动态代理的引入

上面使用到了静态代理,代理类是自己手工实现的,自己创建了java类表示代理类,同时要代理的目标类也是确定的,如果当目标类增多时,代理类也需要成倍的增加,代理类的数量过多,当接口中的方法改变或者修改时,会影响实现类,厂家类,代理都需要修改,于是乎就有了jdk动态代理。
2、动态代理的好处
- 代理类数量减少
- 修改接口中的方法不影响代理类
- 实现解耦合,让业务功能和日志、事务和非事务功能分离
3、动态代理的实现步骤
- 创建接口,定义目标类要完成功能。
- 创建目标类实现接口。
- 创建InvocationHandler接口实现类,在invoke()方法中完成代理类的功能。
- 使用Proxy类的静态方法,创建代理对象,并且将返回值转换为接口类型。
以下是代码案例:
三、总结
代理分为静态代理和动态代理
静态代理需要手动书写代理类,动态代理通过Proxy.newInstance()方法生成
不管是静态代理还是动态代理,代理与被代理者都要实现两样接口,本质面向接口编程
代理模式本质上的目的是为了在不改变原有代码的基础上增强现有代码的功能