JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
cglib动态代理示例:
1、被代理类:CgLibClass
package test.proxy; /** * cglib 被代理类 * * @author guweiqiang */ public class CgLibClass { public void testCglib(){ System.out.println("testCglib..."); } }
2、cglib 代理类:CglibProxy
package test.proxy; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; /** * cglib动态代理类 * * @author guweiqiang */ public class CglibProxy implements MethodInterceptor { private Object target; /** * 创建代理对象 */ public Object getInstance(Object obj){ this.target = obj; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(this.target.getClass()); // 回调函数 enhancer.setCallback(this); // 返回代理对象 return enhancer.create(); } /** * 回调方法 */ public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("事物开始"); proxy.invokeSuper(obj, args); System.out.println("事物结束"); return null; } }
3、cglib 测试类:CglibTest
package test.proxy; /** * cglib 测试类 * * @author guweiqiang */ public class CglibTest { public static void main(String[] args) { CglibProxy proxy = new CglibProxy(); CgLibClass cgLib = (CgLibClass) proxy.getInstance(new CgLibClass()); cgLib.testCglib(); } }
运行结果:
事物开始 testCglib... 事物结束
相关推荐
- 然后,根据目标对象是否实现接口,Spring决定使用JDK还是CGLIB动态代理。 - 接着,Spring创建一个代理对象,该对象持有目标对象的引用,并关联一个`Advised`对象,该对象包含了关于代理的所有信息,如拦截器链。...
在Java中,最常用的动态代理实现有两种:JDK Proxy和CGLIB。 - **JDK Proxy**:基于Java反射API实现,仅支持接口的代理。使用JDK Proxy时,需要指定被代理接口的类型,并且代理类必须实现该接口。 - **CGLIB**:...
### 浅析Java设计模式【3】——代理 #### 一、代理模式概述 代理模式是一种行为型设计模式,主要用于在客户端与目标对象之间起到一个中介的作用,通过代理对象来控制对目标对象的访问。代理模式的核心在于它可以...
Java动态代理是Java编程中一个重要的特性,它允许在运行时创建代理对象,这些代理对象可以作为原有对象的代理,实现在调用方法时添加额外的功能。Spring AOP(面向切面编程)正是利用了这一特性来实现其核心功能——...
在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...
Java提供了两种主要的动态代理实现方式:JDK动态代理和CGLIB动态代理。 - **JDK动态代理**:基于接口的代理,要求被代理的类必须实现至少一个接口。动态代理通过实现`java.lang.reflect.InvocationHandler`接口并...
这里我们将深入探讨Java中的两种主要动态代理实现:JDK动态代理和CGLIB动态代理,以及静态代理作为基础概念的介绍。 首先,我们来看静态代理。静态代理是代理模式的一种实现方式,它要求我们为每个目标接口创建一个...
在Java编程语言中,动态代理是一种强大的特性,它允许我们在运行时创建代理对象来扩展或增强已有对象的功能。动态代理通常用于实现回调、事件监听、事务管理、性能监控等多种功能。下面我们将深入探讨三个动态代理的...
- **动态代理:** 与传统的静态代理不同,CGLIB 可以在运行时动态地生成代理类。 - **支持未实现接口的类:** JDK 动态代理要求代理对象必须实现一个或多个接口,而 CGLIB 则可以直接代理任何实现了非 `final` 方法...
CGlib,全称为Code Generation Library,是一个强大的高性能的代码生成库,它被广泛应用于Java世界,主要用于动态代理、AOP(面向切面编程)以及优化等场景。在Java开发中,如果你需要用到动态代理或者需要在运行时...
Spring 使用 `java.lang.reflect.Proxy` 类来创建动态代理,并通过实现 `java.lang.reflect.InvocationHandler` 接口来处理代理对象的方法调用。在 Spring AOP 中,`org.springframework.aop.framework....
Java中提供了两种动态代理机制:`java.lang.reflect.Proxy`类和`java.lang.invoke.MethodHandle` API。Proxy类用于基于接口的代理,而MethodHandle API更底层,可以处理不基于接口的代理。 3. **Java Proxy类** -...
此外,Java还提供了一个JDK动态代理的替代方案——CGLIB(Code Generation Library),它是一个强大的高性能的代码生成库,可以在运行期扩展Java类与实现Java接口。当目标类没有实现接口时,CGLIB可以作为一个很好的...
在Spring AOP中,有两种主要的代理方式:JDK动态代理和CGLIB代理。这两种代理方式都是为了实现AOP的核心概念——切面(Aspect)和通知(Advice)。 1. JDK动态代理:JDK动态代理基于Java的接口实现,适用于目标对象...
当目标类不支持接口或者用户希望对非接口类型进行代理时,Spring会使用CGLIB生成一个子类来实现动态代理。CGLIB通过字节码技术生成代理类,它可以提供比Java反射API更高的性能。 2. **Objenesis** Objenesis是一个...
这个jar文件——`cglib-2.2.0.jar`是CGlib库的一个版本,它在软件开发中扮演着至关重要的角色,尤其对于Java开发人员而言。这个版本的发布日期可能是在2010年前后,尽管较早,但它仍然是许多项目中的可靠选择,特别...
本资源"Aop.rar"包含了一个关于Java AOP的实际应用示例,重点展示了三种主要的代理实现方式:CGLIB、Javassist和Java动态代理。让我们逐一深入了解这三种技术。 1. **CGLIB(Code Generation Library)**: CGLIB...
CGLIB通过字节码技术生成代理类,可以在运行时动态扩展目标类并添加新的方法或属性。`spring-cglib-repack-3.2.6.jar`是Spring框架使用的CGLIB库的打包版本,可能包含了针对某些特定环境或冲突的修复。 其次,`...
- AOP的实现:动态代理(JDK、CGLIB)和AspectJ。 - Spring Boot的自动配置原理,Spring Cloud相关组件。 以上内容是Java高级面试中可能涉及的关键知识点,深入理解和掌握这些知识将有助于在面试中表现出色。
2. **识别代理类型**:确定是JDK动态代理还是CGLIB代理,这有助于理解代理是如何工作的。 3. **检查配置**:查看Spring的AOP配置,确保没有不必要的重复代理设置。 4. **测试隔离**:尝试去掉一个代理,看看问题是否...