代理

187 阅读1分钟

先介绍一下代理:

代理的优点:

  • 隐藏委托类的实现,调用者只需要和代理类交互
  • 解耦:在不改变委托类的情况下,做一些额外的处理

代理模式的应用:

  1. 在原方法执行之前或之后做一些操作,打日志 事务控制 SpringAOP
  2. 隐藏委托类的实现,只暴露给调用者公共的接口
  3. 延迟加载 hibernate

代理的实现:

  • 静态代理:编译时增强
  • 动态代理:运行时增强,在内存中临时生成AOP动态代理类
    • JDK动态代理:通过反射来接受被代理类,委托类必须实现一个接口,核心是InvocationHandler接口和Proxy类。
    • CGLIB动态代理:如果类没有实现一个接口,就会用CGLib动态代理,通过继承的方式,在运行时动态的生成一个子类,如果某个类被标记为final,就无法使用CGLib动态代理。

总结下来就是:

-- 实现了某个接口:JDK动态代理

-- 没实现接口且没被final标记:CGLib动态代理

-- else:无法被动态代理