您的位置:首页 > 编程语言 > Java开发

Spring中AOP实现的两种方式之JDK和cglib的动态代理

2017-09-07 17:36 1041 查看
AOP的实现原理: 都是基于代理模式,都是生成一个大代理对象 静态AOP: AspectJ实现的AOP, 将切面代码直接编译到Java类文件中 --- 实现: JDK提供的动态代理技术 动态AOP: 将切面代码进行动态织入实现的AOP --- Spring的AOP为动态AOP --- 实现: CGLIB(动态字节码增强技术)

cglib创建的动态代理对象性能比JDK创建性能高很多,但是cglib在创建代理对象的时候所花费时间却是比jdk多的多,所以对于单例的对象,其不需要频繁的创建对象,用cglib更合适,反之,用jdk更好。同时,由于cglib是采用动态创建子类的方法,对于final方法,无法进行代理。
JDK动态代理: --- InvocationHandler 和 Proxy.newProxyInstance() --- 动态代理的基本原理为反射 + 多态 + 聚合 InvocationHandler是一个接口,通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编制在一起。 Proxy利用InvocationHandler动态创建一个符合某一接口的实例,生成目标类的代理对象
JDK动态代理要求被代理者实现一个接口,只有接口中的方法才能被代理, 其方法是,将被代理对象注入到一个中间对象,而中间对象实现InvocationHandler接口, 在实现该接口时,可以在被代理对象调用它的方法时,在调用前后插入一些代码, Proxy.newProxyInstance()能够利用中间对象来生产代理对象,插入的代码就是切面代码
局限: 被代理的对象必须实现接口,而且只有接口中的方法才能被代理
cglib动态代理:--- 字节码生成技术 实现 MethodInterceptor接口,重写其 interceptor()方法 CGLib采用非常底层的字节码技术,可以为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,并顺势织入横切逻辑 继承被代理对象,然后重写被代理的方法,在覆盖该方法时,插入自己的代码, 因为需要重写被代理对象的方法,要求:被代理的方法不能使final方法,因为final方法不能被覆盖

通过jdk的动态代理:jdk的动态代理是基于接口的,必须实现了某一个或多个任意接口才可以被代理,并且只有这些接口中的方法会被代理。
通过cglib动态代理:cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中的方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。

参考blog地址 :
点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: