从多处拷贝粘贴而来,原文无处可考了,感谢几位原创者的付出
JDK动态代理和Cglib动态代理
写了个小demo,GitHub:https://github.com/ConanDennis/dynamicProxyDemo
JDK静态代理:
jdk静态代理实现比较简单,一般是直接代理对象直接包装了被代理对象
JDK动态代理:
1.能够继承静态代理的全部优点.并且能够实现代码的复用.
2.动态代理可以处理一类业务.只要满足条件 都可以通过代理对象进行处理.
3.动态代理的灵活性不强.
4.JDK 的动态代理要求代理者必须实现接口, , 否则不能生成代理对象. .
Cglib动态代理:
1.不管有无接口都可以创建代理对象.
2.cglib创建的代理对象是目标对象的子类.
注意:要在pom中引入cglib依赖
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>
2.2
.
2
</version>
</dependency>
使用spring的AOP代理对象生成策略:
1.在spring中默认条件下如果目标对象有接口,则使用JDK的动态代理.
如果目标对象没有接口则默认使用cgLib动态代理.
2.当从容器中获取对象时,如果获取的对象满足切入点表达式.那么就会为其创
建代理对象.代理对象指定方法就会执行与切入点绑定的通知方法.
优缺点
jdk静态代理类只能为一个被代理类服务,如果需要代理的类比较多,那么会产生过多的代理类。jdk静态代理在编译时产生class文件,运行时无需产生,可直接使用,效率好。
jdk动态代理必须实现接口,通过反射来动态代理方法,消耗系统性能。但是无需产生过多的代理类,避免了重复代码的产生,系统更加灵活。
cglib动态代理无需实现接口,通过生成子类字节码来实现,比反射快一点,没有性能问题。但是由于cglib会继承被代理类,需要重写被代理方法,所以被代理类不能是final类,被代理方法不能是final。
因此,cglib的应用更加广泛一点。