`
wang_luo_xiaozi
  • 浏览: 2087 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

commons proxy--jdk、cglib实现动态代理的异同

阅读更多
   这段时间上班还算空闲,就想研究下其他东西,想来想去,都知道研究什么好,就研究下commons组件吧,以前有看过下,但没细。今天开始看下commons-proxy组件,有点心得,发表下和大家分享,不正确之处请指正。
    首先,先说下jdk和cglib实现动态代理的相异之处。
    一、所代理的目标。
     jdk所代理的是接口,通过Proxy.newProxyInstance(ClassLoader loader,
  Class<?>[] interfaces,
  InvocationHandler h)方法可以创建代理对象,其中loader用来加载代理对象,interfaces是所有要代理的接口,InvocationHandler是我们要实现的处理接口。jdk不能代理对象。
     cglib所代理的是对象,通过Enhancer enhancer = new Enhancer();
...
enhancer.create();创建代理对象。
     二、处理接口不同。
     jdk的处理接口是java.lang.reflect.InvocationHandler,调用代理对象的方法会调用处理接口的invoke(Object proxy, Method method, Object[] args)方法。
     cglib的处理接口是net.sf.cglib.proxy.InvocationHandler、net.sf.cglib.proxy.MethodInterceptor、net.sf.cglib.proxy.Dispatcher,调用代理对象的方法会调用处理接口InvocationHandler的invoke(Object proxy, Method method, Object[] args)方法、MethodInterceptor的intercept( Object object, Method method, Object[] args, MethodProxy methodProxy )或Dispatcher的loadObject()方法。你根据需要实现其中一个接口。
Commons-proxy组件里实现了三种动态代理技术方法(jdk、cglib和javassist)的统一接口,创建三种类型的代理,interceptor、invoker、delegator,分别通过三个处理接口org.apache.commons.proxy.Interceptor、org.apache.commons.proxy.Invoker、org.apache.commons.proxy.ObjectProvider来统一。
由于cglib也提供类似的接口,所有其转化比较容易,在此不介绍。Jdk的InvocationHandler接口的invoke(Object proxy, Method method, Object[] args)方法要分别转化为三个相应的接口。
转化为Interceptor接口。
通过ProxyFactory的内部类InterceptorInvocationHandler来转化。
转化为Invoker接口。
通过ProxyFactory的内部类InvokerInvocationHandler来转化。
转化为ObjectProvider接口。
通过ProxyFactory的内部类DelegatorInvocationHandler来转化。

    今天,先写到这里,改天看完有新的体会在继续写。
0
0
分享到:
评论

相关推荐

    CGLIB需要的asm-2.2.3.jar和cglib-nodep-2.2.jar

    CGLIB-nodep-2.2.jar包含了CGLIB的所有核心类和接口,如Enhancer、MethodInterceptor等,用于实现动态代理和类的增强。 CGLIB的使用主要集中在以下几个方面: 1. **动态代理**:在Java中,如果我们想要在调用某个...

    CGlib动态代理类的jar包

    CGlib是Java动态代理的一种实现方式,它不是依赖于Java的反射机制,而是通过生成目标类的子类来实现代理,因此在性能上通常优于基于接口的JDK动态代理。 CGlib动态代理的核心类包括`Enhancer`、`Callback`和`...

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

    1. cglib-2.2.jar:这是CGLIB的核心库,包含了生成代理类所需的主要类和接口。例如,`net.sf.cglib.proxy.Enhancer`是CGLIB中最常用的类,它可以用来创建代理对象。同时,`net.sf.cglib.core.Predicate`和`...

    cglib的jar包

    这种方法相比JDK自带的java.lang.reflect.Proxy,具有更高的性能,因为JDK的动态代理只能针对实现了接口的类,而CGlib则可以针对任何类,无论其是否实现了接口。 在描述中提到的"cglib-nodep-3.2.5.jar"是CGlib的...

    cglib-nodep-2.2.jar

    这种方法比使用Java代理(Proxy)来实现更灵活,因为Java代理只能针对实现了接口的类进行代理,而CGLIB可以处理任何类。 在**cglib-nodep-2.2.jar** 的压缩包中,除了库本身,还包含了一个名为`cglib-2.2-license....

    SSM-Boot面试题,都是来自工作中的笔记

    - **JDK动态代理**:利用JDK自身提供的Proxy类和InvocationHandler接口,通过反射机制创建代理对象。 - **CGLIB动态代理**:使用CGLIB库,对类进行字节码增强,生成新的子类。 - **动态代理示例**: ```java //...

    proxytoys:有用的Java代理工具集合

    ProxyToys用来代理生成,就像Jakarta Commons Logging用来记录日志一样-一种用于代理创建的精简实现中立API。 使用标准代理还是使用CGLIB是单行代码更改。特征API兼容的代理工厂提供者: JDK的标准代理CGLIB实施...

    jpa规范下的shh2配置要点.docx

    - `hibernate-cglib-repack-2.1_3.jar` 用于代理类的生成,通常在没有Java代理(JDK Proxy)支持的情况下使用。 - `hibernate-commons-annotations.jar` 提供了JPA和Hibernate特定的注解。 - `hibernate-search-...

    spring事物管理配置的5种方式

    主要有两种代理方式:基于接口的JDK动态代理和基于类的CGLIB代理。 接下来,我们将详细探讨五种事务管理配置方式: ### 第一种:每个Bean都有一个代理 在这种方式中,每个需要事务管理的Bean都会被一个事务代理...

    spring aop的jar包

    Spring AOP支持两种类型的代理:JDK动态代理和CGLIB代理。前者基于接口,适用于有接口的目标对象;后者通过字节码技术创建子类,适用于无接口或不希望修改原有代码的情况。 在实际应用中,开发者通常通过XML配置或...

    Spring的aopjar包

    前者在对象被创建时创建代理对象,后者则在类加载阶段进行编织,通常在使用JDK动态代理或CGLIB时采用前者,在使用AspectJ时采用后者。 `aop`和`aspects`涉及的是Spring AOP的实现和使用。`aop`模块包含了Spring AOP...

    java_spring_day05.pdf

    - Spring使用JDK动态代理或者CGLIB动态代理技术来创建代理对象。 - 当目标对象实现了一个或多个接口时,Spring会使用JDK动态代理;如果目标对象没有实现任何接口,则使用CGLIB动态代理。 3. **配置示例:** - ...

    03 mybatis高级(1)3

    Mybatis通过动态代理(如Java的JDK Proxy或CGLIB)创建SqlSession的代理对象,这个代理对象在执行SQL操作时会进行一系列的预处理和后处理,如事务控制、缓存处理等。 **日志模块分析**: Mybatis的日志模块具有灵活...

    Spring所需jar.rar

    4. 代理(Proxy):Spring使用代理模式实现AOP,它可以是JDK动态代理或CGLIB代理,根据目标对象是否实现了接口决定。 在压缩包中,有三个子文件分别对应Spring的不同使用场景: 1. "Spring只用IOC的jar包":这个包...

    Java的Spring框架中AOP项目的一般配置和部署教程

    在Spring中,AOP通过两种代理模式实现:JDK动态代理和CGLIB代理。JDK动态代理基于接口,适用于目标对象实现了接口的情况;而CGLIB代理则是在没有接口的情况下,通过字节码技术创建子类来实现代理,适用于目标对象为...

    spring-framework-reference-4.1.2

    Not Using Commons Logging ................................................................... 12 Using SLF4J ..............................................................................................

    spring-framework-reference4.1.4

    Not Using Commons Logging ................................................................... 12 Using SLF4J ..............................................................................................

Global site tag (gtag.js) - Google Analytics