`
iamweiming
  • 浏览: 41022 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

cglib代理

 
阅读更多

JDK的Proxy实现代理要求被代理的目标对象必须实现一个接口,而如果目标对象没有实现接口则不能使用Proxy来代理。不过我们也可以借助cglib来实现代理,这样目标对象不必实现接口.

要代理的对象:com.spring305.test.aopCglib.UserDao.java

Java代码  收藏代码
  1. public class UserDao {  
  2.   
  3.     private String name;  
  4.   
  5.     public String getName() {  
  6.         return name;  
  7.     }  
  8.   
  9.     public void setName(String name) {  
  10.         this.name = name;  
  11.     }  
  12.   
  13.     public UserDao(String name) {  
  14.         this.name = name;  
  15.     }  
  16.   
  17.     public UserDao() {  
  18.         // TODO Auto-generated constructor stub  
  19.     }  
  20.   
  21.     public void print1() {  
  22.         System.out.println(UserDao.class.toString() + " print1()");  
  23.     }  
  24.   
  25.     public void print2() {  
  26.         System.out.println(UserDao.class.toString() + " print2()");  
  27.     }  
  28. }  

 

 com.spring305.test.aopCglib.CglibFactory.java

Java代码  收藏代码
  1. import net.sf.cglib.proxy.Enhancer;  
  2. import net.sf.cglib.proxy.MethodInterceptor;  
  3. import net.sf.cglib.proxy.MethodProxy;  
  4. import java.lang.reflect.Method;  
  5.   
  6. public class CglibFactory implements MethodInterceptor {  
  7.   
  8.     private Object target;  
  9.   
  10.     public Object createUserDao(Object target) {  
  11.         this.target = target;  
  12.         //用enhancer类来创建代理对象  
  13.         Enhancer enhancer = new Enhancer();  
  14.         //设置父类,即为目标类  
  15.         enhancer.setSuperclass(this.target.getClass());  
  16.         // cglib创建的代理对象,其实就是继承了要代理的目标类,然后对目标类中所有非final方法进行覆盖,但在覆盖方法时会添加一些拦截代码。  
  17.         // 注册回调器,回调下面intercept  
  18.         enhancer.setCallback(this);   
  19.         //返回创建的代理对象  
  20.         return enhancer.create();  
  21.     }  
  22.   
  23.     @Override  
  24.     //参数依次代表:代理对象本身,被拦截到的方法,方法的参数,方法的代理对象  
  25.     //切面,指横切性关注点的抽象,与类相似,但是两者的关注点不同,类是对物体特征的抽象  
  26.     //连接点:指那些被拦截到的点,spring只支持方法类型的连接点  
  27.     //切入点:指我们要对连接点进行拦截的定义  
  28.     //通知:拦截到连接点后做的事情即为通知  
  29.     //Target,目标对象:代理的目标对象  
  30.     //织入:将aspectJ应用到target对象,并导致proxy对象创建的过程  
  31.     //引入:在不修改类代码前提下,引入可以在运行期为类动态地添加一些方法或者field  
  32.     public Object intercept(Object proxy, Method method, Object[] args,  
  33.             MethodProxy methodProxy) throws Throwable {//环绕通知  
  34.         UserDao udi = (UserDao) target;  
  35.         Object result = null;  
  36.         if (udi.getName() != null) {  
  37.             // 前置通知 advice()  
  38.             try {  
  39.                 result = methodProxy.invoke(target, args);  
  40.                 // 后置通知 afterAdvice()  
  41.             } catch (Exception e) {  
  42.                 e.printStackTrace();  
  43.                 // 例外通知 exceptionAdvice  
  44.             } finally {  
  45.                 // 最终通知  finalyAdvice  
  46.             }  
  47.         }  
  48.         return result;  
  49.     }  
  50. }  

 测试:

Java代码  收藏代码
  1. @Test  
  2.     public void cglibTest(){  
  3.         CglibFactory test = new CglibFactory();  
  4.         //UserDao dao = (UserDao)test.createUserDao(new UserDao());  
  5.         UserDao dao = (UserDao)test.createUserDao(new UserDao("aa"));  
  6.         dao.print1();  
  7.         dao.print2();  
  8.     }  

 

分享到:
评论

相关推荐

    浅谈JDK动态代理与CGLIB代理去区别

    在Java开发中,动态代理和CGLIB代理是两种常见的面向切面编程(AOP)实现方式,它们都用于在不修改原有代码的情况下,增强或扩展对象的功能。本篇文章将深入探讨JDK动态代理和CGLIB代理的区别,以及它们在实际应用中...

    cglib代理模式要使用的相关jar包

    以上就是CGLIB代理模式的基本原理和使用方法。CGLIB的动态代理在很多场景下都非常实用,例如在AOP框架中拦截方法执行,进行日志记录、性能监控、事务管理等。然而,由于CGLIB是基于继承的,所以如果目标类为final...

    java代理机制 JDK动态代理和cglib代理 详解

    本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口实现,它要求被代理的类必须实现至少一个接口。在运行时,Java会动态地创建一个新的类,这个类实现了与原始...

    Java 动态代理和Cglib代理(二)

    在Java编程领域,动态代理和Cglib代理是两种常用的技术,用于在运行时创建对象的代理,以实现额外的功能,如AOP(面向切面编程)中的日志、事务管理等。本篇文章将深入探讨这两种代理机制,尤其是Cglib代理。 首先...

    简单模拟spring cglib代理

    Spring支持两种代理机制:基于接口的JDK动态代理和基于类的CGLIB代理。 CGLIB(Code Generation Library)是一个强大的高性能代码生成库,其底层是通过使用操作Java字节码的开源字节码操作框架(比如ASM)来实现的...

    CGLib代理jar包

    CGLib代理是Java中实现动态代理的一种方式,与另一种常用的JDK动态代理相比,CGLib在处理非接口类的代理时具有更高的性能优势。 CGLib的核心是通过ASM库来操作字节码生成新的类,这些新生成的类是对原始类的扩展,...

    CGLib代理模式用到的jar包

    CGLib代理主要分为两种类型:接口代理和类代理。对于实现了接口的类,CGLib可以像JDK的动态代理一样工作,但如果目标类没有实现任何接口,CGLib则可以通过生成目标类的子类来实现动态代理。CGLib的核心类包括...

    JDK动态代理和CGLIB代理

    JDK动态代理和CGLIB代理是两种常用的实现方式。 首先,我们来看看JDK动态代理。JDK动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类用于创建一个代理对象...

    JDK代理和Cglib代理

    JDK代理和Cglib代理是两种常用的动态代理实现方式。 **JDK代理(Java Dynamic Proxy)** JDK动态代理是Java标准库提供的一种代理机制,位于`java.lang.reflect`包下的`Proxy`类和`InvocationHandler`接口。JDK代理...

    cglib代理jar包

    了解和掌握CGlib代理技术,能够极大地提升我们的代码复用性和可维护性,特别是在构建复杂的企业级应用时,CGlib代理能够帮助我们更好地实现面向切面的编程。 总的来说,`cloud-cglib.jar`这个压缩包中的CGlib库为...

    JAVA JDK静态代理、动态代理、CGlib代理的代码演示

    CGlib代理通过继承目标类并覆写其方法来实现,因此即使目标类没有接口也可以进行代理。 总结来说,JDK静态代理适用于目标类实现了接口的情况,而动态代理和CGlib则更灵活,可以处理无接口的目标类。动态代理更简洁...

    cglib代理的依赖jar包

    **CGlib代理详解** 1. **原理介绍** CGlib代理机制主要是通过动态创建一个目标类的子类,并重写其方法来实现代理。当调用代理对象的方法时,实际上是调用了子类的方法,从而可以在不修改原有代码的情况下对目标类...

    java 动态代理实例(JDK代理与CGLIB代理)

    动态代理主要分为两种:JDK代理和CGLIB代理。 **JDK代理**是基于接口的代理,它通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。当我们的目标对象实现了特定的接口时,我们可以...

    示例代码:java动态代理和cglib代理的简单例子

    Java动态代理和CGLIB代理是两种常用的在Java中实现面向切面编程(AOP)的技术,它们允许我们在不修改原有代码的情况下,为方法添加额外的功能,如日志记录、性能监控、事务管理等。本篇文章将深入探讨这两种代理机制...

    cglib代理资料类,静态代理动态代理

    以上就是关于静态代理、动态代理(JDK)和CGlib代理的基本介绍。它们在Java开发中都有广泛的应用,尤其是在AOP(面向切面编程)和框架设计中,如Spring AOP就使用了这两种代理技术。了解并熟练掌握这些代理机制,...

    Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现.doc

    Spring AOP提供了两种代理方式:JDK动态代理和Cglib代理。 Cglib代理是Spring AOP在无法使用JDK动态代理(例如代理的目标对象没有实现接口)时的另一种选择。Cglib是一个强大的、高性能的代码生成库,它基于ASM库来...

    jdk 的动态代理和CGLIB代理

    jdk 的动态代理和CGLIB代理

    cglib创建代理类.rar

    springAOP等框架中,大量用到代理技术; 两类代理技术: 1,java动态代理,见JDK文档或相关java书; 2.cglib创建代理类,比第一种更加简单,代理类和背代理类不需要实现共同接口。本例子就是cglib代理的例子,很简单

    CGLIB代理例子

    CGLIB代理是一种在Java编程中广泛使用的动态代理技术,尤其在Spring框架中扮演着重要角色。CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,它可以在运行期扩展Java类与实现Java接口。当JDK动态...

    动态代理中clig包(Cglib代理模式).zip

    Cglib代理模式实现步骤 1) 需要引入cglib的jar文件 2) 在内存中动态构建子类,注意代理的类不能为final,否则报错 java.lang.IllegalArgumentException: 3) 目标对象的方法如果为final/static,那么就不会被拦截,即...

Global site tag (gtag.js) - Google Analytics