静态代理
若代理类在程序运行前就已经存在,那么这种代理方式被称为静态代理,这种情况下的代理类通常都是我们在java代码中定义的。通常情况下,静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类。
优点:
1、可以隐藏为委托类的实现
2、可以实现客户与委托类间的解耦,在不修改委托类代码的情况下能够做一些额外的处理
JDK动态代理
1、因为利用JDKProxy生成的代理类实现了接口,所以目标类中所有的方法在代理类中都有
2、生成的代理类的所有的方法都拦截了目标类的所有的方法。而拦截器中invoke方法的内容正好就是代理类的各个方法的组成提
3、利用JDKProxy方式必须有接口的存在
4、invoke方法中的三个参数可以访问目标类的被调用方法的API、被调用方法的参数、被调用方法的返回类型
CGLIB动态代理
1、CGLIB是一个强大的,高性能,高质量的code类库。它可以在运行期扩展java类与实现java接口
2、用CGLIB生成代理类是目标类的子类
3、用CGLIB生成代理类不需要接口
4、用CGLIB生成的代理类重写了父类的各个方法
5、拦截器中的intercept方法内容正好就是代理类中的方法体
动态代理之两种代理方式优缺点比较
1、若目标对象实现了若干接口,Spring使用JDK的java.lang.reflect.Proxy类代理
优点:因为有接口,所以使系统更加松耦合
缺点:为没一个目标类创建接口
2、若目标对象没有实现任何接口,Spring使用CGLIB库生成目标对象的子类
优点:因为代理类与目标类是继承关系,所以不需要有接口的存在
缺点:因为没有使用接口,所以系统的耦合性没有使用JDK的动态代理好