上次实践了下java的动态代理,在Spring除了缺省的用这个,额外还提供了使用CGLIB实现AOP的方式。这里我就把CGLIB的AOP也实践了一把,呵呵。在这里记录下,方便以后的回顾。
CGLIB的实现方式不再是依赖JDK自身的特性了,而是封装了asm,在运行期动态生成新的class。最大的区别就是无需像jdk中的proxy必须基于接口了。
但是,加载 cglib 消耗的时间比直接 jdk 反射时间要长,所以在开发的过程中,如果是反复动态生成新的代理类推荐用 jdk 自身的反射,反之用 cglib。
实践的代码:
1.新建一个被代理的类:MyAct.java
package com;
public class MyAct {
public void sayHello(String name) {
// TODO Auto-generated method stub
System.out.println("hello " + name);
}
public void sayBye(String name) {
// TODO Auto-generated method stub
System.out.println("bye "+name);
}
}
2.在新建个代理类:
package com.myProxy;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class Proxyhandle implements MethodInterceptor{
/**
* obj - 感觉是个代理后的类,所以必须要用methodProxy.invokeSuper进行调用原来的方法。
* method - 被拦截的方法
* args - 数组:被拦截的方法的参数对象数组
* proxy - enhancer 生成的class类,可以执行员class的方法,也可以执行代理生成的class类的方法。
*/
public Object intercept(Object obj, Method method, Object[] objs,
MethodProxy methodProxy) throws Throwable {
Object result = null;
System.out.println("你执行的方法为:"+method.getName());
result = methodProxy.invokeSuper(obj, objs);
System.out.println("实例方法执行结束.");
return result;
}
}
3.最后写个测试类吧:
package com.main;
import com.MyAct;
import com.myProxy.Proxyhandle;
import net.sf.cglib.proxy.Enhancer;
public class MainTest {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(MyAct.class);
//指定代理类,cglib会根据指定的类生成新的类覆盖以前的类返回
enhancer.setCallback(new Proxyhandle());
MyAct act = (MyAct) enhancer.create();
act.sayHello("jack");
}
}
结果为:
你执行的方法为:sayHello
hello jack
实例方法执行结束.
这样就实现了AOP的拦截了,CGLIB还有很多其他的用法,可查询官方API地址为:http://cglib.sourceforge.net/apidocs/index.html
分享到:
相关推荐
在Spring AOP中,有两种主要的实现方式:代理模式和CGLIB。代理模式是基于接口的,当目标对象实现了接口时,Spring会创建一个与该接口匹配的代理对象,通过代理对象来执行增强的逻辑。而CGLIB(Code Generation ...
动态代理和CGLIB在Java开发中扮演着重要的角色,特别是在实现面向切面编程(AOP)和增强对象功能方面。动态代理允许我们在不修改原始代码的情况下,为已有对象添加额外的功能,比如日志记录、性能监控等。而CGLIB...
Spring 提供了两种方式来实现AOP代理:JDK动态代理和CGLIB代理。 1. **JDK动态代理**: - JDK动态代理基于Java的接口实现,适用于目标对象实现了接口的情况。Spring会为这个接口创建一个代理类,代理类在调用真实...
- **CGLIB代理**:CGLIB通过ASM生成一个继承自目标类的新类,这个新类覆盖了目标类的所有方法,并在这些方法内部调用拦截器链。在运行时,这个新类的实例作为代理对象。 5. **优缺点**: - JDK代理简单易用,但...
CGLIB代理是一种在Java编程中广泛使用的动态代理技术,尤其在Spring框架中扮演着重要角色。CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,它可以在运行期扩展Java类与实现Java接口。当JDK动态...
2. CGLib代理项目: - src/main/java:包含目标类 - target/classes:编译后的class文件,包括目标类的class文件,以及由CGLib生成的子类class文件 - 测试代码:展示如何使用Enhancer创建代理对象并调用方法 这...
本资源提供的示例涵盖了这些核心概念,通过JDK动态代理、CGLIB动态代理以及拦截器链的实践,帮助开发者深入理解并掌握这些技术。 首先,让我们来探讨JDK动态代理。Java标准库中的`java.lang.reflect.Proxy`类和`...
动态代理(Aspect-Oriented Programming,AOP)是面向切面编程的一种编程范式,它主要用来解决传统面向对象编程中难以处理的横切关注...这个例子对于初学者来说是一个很好的实践,有助于深入理解AOP和动态代理的概念。
JDK代理适用于目标对象实现了接口的情况,而CGLIB代理则是在目标对象没有接口或者接口数量不足以表达业务逻辑时的选择。CGLIB是一个强大的字节码操作库,它能在运行时动态生成子类,从而创建代理对象。 在Spring中...
通过CGLIB的学习和实践,开发者可以更好地理解和运用代理模式,提升代码的灵活性和可维护性。在实际开发中,正确地利用CGLIB可以有效地提高代码的复用性和解耦性,使得业务逻辑更加清晰,同时也可以方便地进行事务...
然后,在Spring配置文件中启用CGLIB代理,可以设置`proxy-target-class="true"`属性: ```xml <aop:config proxy-target-class="true"> <!-- 配置切面 --> ... </aop:config> ``` 接下来,创建一个需要代理的...
代理设计模式是软件开发中的一种重要模式,它允许我们在不修改原有对象的基础上,通过代理对象对原对象进行增强或控制。本资源主要涵盖了静态...通过学习和实践,你可以更好地掌握代理设计模式以及Spring AOP的使用。
“proxy”则指的是代理,在Spring AOP中,主要有两种代理方式:JDK动态代理和CGLIB代理。JDK动态代理是基于接口的,当目标对象实现了接口时,Spring会创建一个实现了相同接口的代理类。而CGLIB代理则是基于字节码...
JDK动态代理适用于实现了接口的类,而CGLIB代理则用于没有接口或者接口方法不够用的情况。 标签中的"自己用"暗示这是一个个人实践项目,可能包含特定的需求和定制化设置。 从压缩包文件的名称来看,有三个文件: 1...
7. **应用场景**:CGLib常用于AOP框架中,实现方法的拦截和增强,例如Spring AOP的默认代理方式就是CGLib。另外,它还可以用于性能测试,通过生成动态类模拟大量对象,以测试系统的性能瓶颈。 在实际开发中,掌握...
4. **测试类**:用来验证CGlib代理是否正确工作,可能会有调用代理对象的方法并观察其行为的代码。 **依赖库**: - **cglib-2.1.3.jar**:CGlib的核心库,提供字节码生成和代理功能。 - **asm.jar**:ASM是一个Java...
还可能包括asm.jar,这是一个用于读写Java字节码的库,Spring AOP在使用CGLIB代理时可能会用到。 总之,AOP提供了一种有效处理系统中横切关注点的方式,Spring框架通过代理和通知机制使得AOP的实现变得简单易用。...
在Java 1.8环境下,Spring AOP支持两种类型的代理:JDK动态代理和CGLIB代理。JDK动态代理适用于实现了接口的类,而CGLIB代理则适用于没有实现接口的类。在本项目中,可能使用了JDK动态代理,因为描述中提到了"需要...
JDK动态代理适用于实现了接口的类,而CGLIB代理则可以在没有接口的情况下工作,通过字节码技术创建被代理类的一个子类。 **AOP术语解释:** 1. **切面(Aspect)**:切面是AOP的核心,它封装了多个相关操作的逻辑,...
2. **Spring AOP简介**:讲解Spring框架如何提供AOP支持,包括基于代理的AOP(JDK动态代理和CGLIB代理)和基于注解的AOP。 3. **创建切面**:演示如何定义一个切面类,该类包含通知方法,这些方法将在特定的连接点...