先总结一下上篇文章使用JDK动态代理实现AOP的步骤:
- 定义一个服务类接口
- 进行接口的实现
- 编写InvocationHandler的实现类用于封装目标对象和目标类的方法
- 声明接口类型的服务实现类对象,使用该对象创建我们的InvocationHandler实现类
- 使用Proxy.newProxyInstance方法获得目标对象的封装对象
当然我们也总结了JDK动态代理的一些缺点,我们可以对比Cglib看看哪个更加强大、各有什么优缺点、什么条件下选择哪种动态代理实现方式。JDK动态代理的缺点有:
- 必须要存在服务类接口。如论你的业务逻辑复杂与否都必须提供一个服务接口,哪怕是标志接口
- 代理对象的创建效率跟正常的new操作没有区别,所以说代理对象的创建没有额外的性能损耗但是使用JDK动态代理创建的代理对象是在运行时动态的更改类的信息,所以使用时效率受到了很大的影响
- 创建代理对象的过程有点繁琐(上面总结的5步)
下面来看Cglib动态代理:Cglib动态代理使用底层的字节码技术,为每个代理对象生成一个子类,在子类中拦截所有父类的方法,织入横切代码。
这里来看一个接口:MethodInterceptor,属于cglib-nodep-2.1_3.jar。该接口只有一个方法用于拦截父类的方法:intercept(Object obj,Mathod method,Object[] args,MethodProxy proxy),参数中的各个对象分别是目标对象,目标方法,目标方法的参数,代理方法。下面再看看上一篇文章中使用JDK实现动态代理的代码怎样使用Cglib怎样进行实现。
代理对象:
class CglibProxy implements MethodInterceptor{
private Enhancer enhancer = new Enhancer();
public Object getProxy(Class clz){
enhancer.setSuperclass(clz);
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
PerformanceMonitor.begin(obj.getClass().getName()+"."+method.getName()+"()");
Object result = method.invoke(obj, args);
PerformanceMonitor.end();
return result;
}
}
该代理对象提供了一个工厂方法用于获得代理对象,封装了代理对象的创建过程。再看看测试代码:
CglibProxy cglibInterceptor = (CglibProxy) new CglibProxy().getProxy(ForumServiceImpl.class);
forumService.removeForum(1);
forumService.removeTopic(200);
这样以来,创建代理对象的方法就被浓缩到了一行,是不是比使用JDK动态代理更加明了?当然,使用GDK动态代理创建代理对象的方法我们也可以进一步优化。
最后我们再来对比一下GDK动态代理和Cglib两者实现AOP的各自优缺点:
- 使用Cglib实现动态代理时,是使用字节码技术创建一个目标类的子类,然后使用该子类的实例作为代理对象进行业务操作。所以,创建代理对象的过程效率降低了【使用GDK动态代理创建代理对象效率的八分之一】,因为要先创建目标类的子类。但是执行业务操作时效率是Cglib的10倍。
- 以用GDK动态代理时创建代理对象的效率相比Cglib很高(8倍),但是它创建出来的对象在进行业务操作时动态的进行Class信息的更改,所以使用效率低,是Cglib的十分之一。所以说:如果一个业务代理对象是单例的,完全应该使用Cglib进行实现。
- 使用Cglib进行动态代理,是创建一个子类继承至目标类,所以不需要像GDK动态代理那样提供一个接口,这样节约了类的个数。
作为代理的入门课程,AOP的前两节基础课程就讲到这里,下节课开始正式写Spring的AOP!
分享到:
相关推荐
spring之AOP(动态代理),包括jdk动态代理和CGLib动态代理
主要对Spring AOP的相关概念和简单的静态代理、动态代理以及常见的几种AOP配置方式做总结学习。主要包括:1. AOP的常见概念 2. 静态代理 3. jdk动态代理 4. Aspectj and Aspectjweaver 5. **aop-config** 6. CGLIB ...
SpringAOP动态代理 Spring AOP 使用的动态代理主要有两种方式:JDK 动态代理和 CGLIB 代理。 JDK 动态代理:用于代理实现了接口的类。Spring 会使用 java.lang.reflect.Proxy 类来创建代理对象。 CGLIB 代理:用于...
我们还提供了示例,展示如何在Spring AOP中使用CGLib动态代理。 JDK动态代理与CGLib的比较: 我们将比较这两种动态代理方式的优劣势,以帮助您选择适合您项目需求的代理方式。您将了解它们在性能、可用性和适用场景...
spring aop 编程,cglib ,切面编程
AOP之JDK动态代理和CGLib动态代理 ,具体效果和过程看博文 http://blog.csdn.net/evankaka/article/details/45195383
Spring框架的AOP中重要的一个知识点,动态代理,springAOP框架会根绝实际情况选择使用jdk的动态代理还是cglib的动态代理
如果想使用CGLIB的技术来生成代理对象,那么需要引入CGLIB的开发的jar包,在Spring框架核心包中已经引入了CGLIB的开发包了。所以直接引入Spring核心开发包即可!
SpringAOP之探秘(动态代理、责任链模式、注解使用)- 详情:https://blog.csdn.net/Dream_Weave/article/details/85008674
Spring-AOP-利用java中的动态代理和Spring的拦截器做到AOP
Spring AOP实现方法之一:CGLIB 实现AOP功能
package com.gc.cglib下为:aop方式cglib代理 package com.gc.dynproxy下为:aop方式动态代理 package com.gc.javaproxy下为:java代理机制实现 package com.gc.proxy下为:自定义代理模式(面向接口编程) ...
静态代理--不适合企业开发,适合初学者理解代理。 jdk动态代理--适合企业级开发,但是它要求必须面向接口编程,假如目标类没有实现接口...spring 的AOP功能中 会根据目标类是否实现了接口来判断使用 jdk Proxy还是cglib
cglib实现动态代理所依赖的jar包 在学习spring中会用到
基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)...
如果一个类实现了一个或多个接口,那么Spring就会使用默认的JDK动态代理,如果没有实现任何接口,就会使用cglib来代理。当然我们也可以手动改变这些设置。这也是比较容易掉坑的部分,如果设置错了代理方式,那么在...
3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换 如何强制使用CGLIB实现AOP? * 添加CGLIB库,SPRING_HOME/cglib/*.jar * 在spring配置文件中加入<aop:aspectj-...
哪怕没有看过源码的同学也应该知道,AOP是通过动态代理实现的,动态代理又分为两个部分:JDK动态代理和CGLIB动态代理 确实,Spring也就是通过这两种方式来实现AOP相关功能,下面就通过源码来简单求证下
Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现.doc
Spring 作为 Java 中最流行的框架,主要归功于其提供的 IOC 和 AOP 功能。本文将讨论 Spring AOP 的实现。第一节将介绍 AOP 的相关概念,若熟悉可跳过,第二节中结合源码介绍 Spring 是如何实现 AOP 的各概念。 1. ...