代理模式:就是在不修改原来对象的前提下,提供额外的功能与操作。
静态代理:(现在我有一个功能,想要在方法前后加日志,我可以把 【日志+被代理对象.方法+日志】作为新方法 )
缺点:比如说,我现在有100个类似的方法,都需要加日志,我需要写100个代理类。但是日志信息是功能相同的,可以复用,这就不符合java设计原则。
动态代理:我们可以把日志方法固定,动态插入各个方法,进行日志输出
JDK
- 代理类实现Invocationhandler接口的invoke() 方法
- 使用Proxy类的静态方法 newProxyinstance() 获取代理实例,实际调用的是invoke() 方法
JDK代理有一个缺点就是只能代理实现接口的类
为了解决这个问题,我们可以用 CGLIB 动态代理机制来避免。
GCLIB
- 定义一个类;
- 自定义 MethodInterceptor 并重写 intercept 方法,intercept 用于拦截增强被代理类的方法,和 JDK 动态代理中的 invoke 方法类似;
- 通过 Enhancer 类的 create()创建代理类;