原理解析
代理模式(Proxy Design Pattern)在不改变原始类(或叫被代理类)代码的情况下, 通过引入代理类来给原始类附加功能.
我们可以通过继承或其他方式来实现静态代理, 来实现对原始类的功能扩展.
动态代理
如果需要代理的类太多, 使用静态代理就需要为每个类都创建一个代理类, 这样过于复杂, 我们可以使用动态代理来实现. 事先不为每个原始类编写代理类, 而是在运行时, 动态的创建原始类对应的代理类, 然后在系统中用代理类替换掉原始类.
Spring AOP底层的实现原理就是基于动态代理, 用户配置好需要给哪些类创建代理, 并定义好在执行原始类的业务代码前后执行哪些附加功能. Spring为这些类创建动态代理对象, 并在JVM中替代原始类对象.
代理模式的应用场景
-
业务系统的非功能性需求开发
比如需要开发一些非功能性的需求, 监控, 统计, 鉴权, 限流等等. 将这些附加功能与业务功能解耦, 放到代理类中同样处理.
-
代理模式在RPC, 缓存中的应用
实际上RPC框架也可以看作一种代理模式. 通过远程代理, 将网络通信, 数据编解码等细节隐藏起来.
同样在缓存中, 我们对于某些接口希望在一定时间内的相同参数使用缓存中的结果, 而不是进行数据库查询或者其他计算, 我们可以利用代理模式, 先从缓存中查询, 如果查询不到结果再去走原始类的逻辑.