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地址 :
点击打开链接
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地址 :
点击打开链接
相关文章推荐
- Spring中AOP实现的两种方式之JDK和cglib的动态代理
- Spring AOP 代理实现的两种方式: JDK动态代理 和 Cglib框架动态代理
- Spring系列之 (十一):AOP实现方式:动态代理的两个方式(JDK和Cglib)
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- Spring—AOP两种代理机制对比(JDK和CGLib动态代理)
- 实现动态代理的两种方式介绍+例子demo(JDK、CGlib)
- Spring AOP实现方式 - JDK动态代理和CGLIB动态代理
- spring aop提供了两种实现方式jdk和cglib
- spring对AOP的支持(JDK的动态代理实现AOP和CGLIB实现AOP)
- 动态代理的两种实现方式(JDK/Cglib)
- 静态代理、JDK动态代理、CGLIB动态代理、Spring实现AOP、IOC+AOP
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- spring实现AOP的两种方式以及实现动态代理方式
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- Spring(十)通过动态代理(JDK的Proxy)和cglib实现AOP技术
- 10077---Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- JDK和CGLib两种方式实现动态代理模式
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)