快捷搜索: 王者荣耀 脱发

AOP的两种动态代理机制

JDK动态代理和Cglib动态代理

写了个小demo,GitHub:

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的应用更加广泛一点。

经验分享 程序员 微信小程序 职场和发展