先介绍一下代理:
代理的优点:
- 隐藏委托类的实现,调用者只需要和代理类交互
- 解耦:在不改变委托类的情况下,做一些额外的处理
代理模式的应用:
- 在原方法执行之前或之后做一些操作,打日志 事务控制 SpringAOP
- 隐藏委托类的实现,只暴露给调用者公共的接口
- 延迟加载 hibernate
代理的实现:
- 静态代理:编译时增强
- 动态代理:运行时增强,在内存中临时生成AOP动态代理类
- JDK动态代理:通过反射来接受被代理类,委托类必须实现一个接口,核心是InvocationHandler接口和Proxy类。
- CGLIB动态代理:如果类没有实现一个接口,就会用CGLib动态代理,通过继承的方式,在运行时动态的生成一个子类,如果某个类被标记为final,就无法使用CGLib动态代理。
总结下来就是:
-- 实现了某个接口:JDK动态代理
-- 没实现接口且没被final标记:CGLib动态代理
-- else:无法被动态代理