`
liaofeng_xiao
  • 浏览: 127301 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring AOP(2):Cglib动态代理

阅读更多
先总结一下上篇文章使用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!
分享到:
评论
1 楼 pch272215690 2012-02-17  
测试代码无法运行,死循环了:enhancer.setCallback(this);

相关推荐

    转载:cglib动态代理介绍(一)

    - **AOP(面向切面编程)**:在Spring框架中,CGlib常用来实现类级别的AOP代理,当目标类没有实现接口时,Spring会自动选择CGlib来生成代理。 - **性能优化**:对于那些不支持接口或者性能要求较高的场景,CGlib比...

    spring_aop_cglib的实现方式

    在Spring AOP(面向切面编程)中,CGLIB是一个重要的动态代理库,它用于在运行时创建子类以实现对目标对象的代理。CGLIB是针对那些不支持接口代理(例如Java中的final类)的情况而设计的。下面我们将深入探讨Spring ...

    AOP之JDK动态代理和CGLib动态代理

    Spring框架是AOP实现的一个典范,它提供了两种主要的动态代理方式:JDK动态代理和CGLib动态代理。 **JDK动态代理**: JDK动态代理基于Java的反射API实现,适用于接口代理。当目标对象实现了至少一个接口时,Spring...

    spring之AOP(动态代理)

    在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...

    Spring框架中JDK动态代理和cglib动态代理

    Spring 框架中 JDK 动态代理和 CGLIB 动态代理是 Spring AOP 中一个非常重要的知识点。Spring AOP 框架会根据实际情况选择使用 JDK 的动态代理还是 CGLIB 的动态代理。 JDK 动态代理是 Java 自带的动态代理机制,它...

    cglib及其依赖包

    CGLib,全称为Code Generation Library,是一个强大的高性能的代码生成库,它在Java世界中被广泛应用,尤其是在动态代理和AOP(面向切面编程)领域。这个库的主要功能是能够在运行时动态创建类或者增强已有类的功能...

    springAop.rar_AOP java_cglib_spring aop

    在Spring AOP中,有两种主要的实现方式:代理模式和CGLIB。代理模式是基于接口的,当目标对象实现了接口时,Spring会创建一个与该接口匹配的代理对象,通过代理对象来执行增强的逻辑。而CGLIB(Code Generation ...

    Spring AOP 中 JDK 和 CGLib 动态代理哪个更快?.docx

    Spring AOP 中 JDK 和 CGLib 动态代理哪个更快?

    SpringAOP的实现机制(底层原理)、应用场景等详解,模拟过程的实例

    我们还提供了示例,展示如何在Spring AOP中使用CGLib动态代理。 JDK动态代理与CGLib的比较: 我们将比较这两种动态代理方式的优劣势,以帮助您选择适合您项目需求的代理方式。您将了解它们在性能、可用性和适用场景...

    深入解析Spring AOP源码:从原理到实现,全方位掌握Java AOP编程精髓

    Spring AOP主要通过动态代理机制实现,根据目标对象是否实现了接口,它会使用JDK动态代理或CGLIB代理。当目标对象是接口类型时,Spring会使用JDK的Proxy类生成一个实现了该接口的代理对象;若目标对象没有接口,...

    Spring-AOP-JDK动态代理

    5. **配置代理**:Spring会根据目标对象是否实现了接口来决定使用JDK动态代理还是CGLIB代理。如果目标对象实现了接口,Spring会选择JDK动态代理。动态代理类会继承自`java.lang.reflect.Proxy`,并实现目标对象的...

    springAOP配置动态代理实现

    2. **CGLIB动态代理**:如果目标类没有实现接口,Spring会使用CGLIB库创建一个目标类的子类,子类覆盖目标类的方法并在方法调用前后插入通知。CGLIB代理提供了更广泛的应用场景,但相比JDK动态代理,它的性能稍差。 ...

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    Spring AOP支持不同的代理策略,包括JDK动态代理和CGLIB代理。如果被代理的类没有实现接口,Spring AOP会采用CGLIB来生成代理对象。CGLIB(Code Generation Library)是一个开源的代码生成库,它允许运行时在内存中...

    死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序.pdf

    在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态代理。 JDK 动态代理是基于接口的,它要求被代理的目标对象必须实现至少一个接口。Spring 使用 `java.lang.reflect.Proxy`...

    SpringAOP之探秘(动态代理、责任链模式、注解使用)

    你可能会看到如何通过Spring AOP自定义代理类,以及如何利用JDK动态代理和CGLIB来拦截并增强方法的执行。 3. **第六章_cache-demo.zip**:此示例可能进一步扩展了缓存相关的实现,包括不同类型的缓存策略、缓存更新...

    jdk与cglib动态代理与底层实现

    JDK和CGLIB是Java中实现动态代理的两种主要方式,它们在Spring框架中扮演着关键角色,尤其是在AOP(面向切面编程)中。 1. **JDK动态代理**: JDK动态代理基于Java的接口机制实现,因此,要使用JDK动态代理,被...

    springAop的配置实现

    - **代理(Proxy)**:Spring AOP通过代理模式来实现切面功能,有JDK动态代理和CGLIB代理两种方式。 **2. JDK 动态代理** - 当目标类实现了接口时,Spring AOP会选择使用JDK动态代理。它会生成一个实现了目标类所有...

    Jdk动态代理和cglib动态代理原理

    在实际开发中,如Spring AOP框架就同时支持JDK和CGLIB动态代理,根据目标类是否实现接口自动选择合适的代理方式。 总结来说,JDK动态代理和CGLIB动态代理都是为了在运行时提供对目标对象的增强,它们通过不同的实现...

    Java动态代理(Spring Aop原理)

    Spring AOP提供了两种代理方式:JDK动态代理和CGLIB代理。JDK动态代理用于目标对象实现接口的情况,而CGLIB代理则用于目标对象没有实现接口的情况。Spring默认使用JDK动态代理,但如果目标对象没有实现接口,它会...

    springAOP所需jar包

    Spring AOP的实现基于动态代理,有两种代理方式:JDK动态代理和CGLIB动态代理。JDK动态代理主要针对实现了接口的类,而CGLIB代理则针对未实现接口的类,Spring会根据目标对象是否实现了接口来选择合适的代理方式。 ...

Global site tag (gtag.js) - Google Analytics