这段时间上班还算空闲,就想研究下其他东西,想来想去,都知道研究什么好,就研究下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来转化。
今天,先写到这里,改天看完有新的体会在继续写。
分享到:
相关推荐
CGLIB-nodep-2.2.jar包含了CGLIB的所有核心类和接口,如Enhancer、MethodInterceptor等,用于实现动态代理和类的增强。 CGLIB的使用主要集中在以下几个方面: 1. **动态代理**:在Java中,如果我们想要在调用某个...
CGlib是Java动态代理的一种实现方式,它不是依赖于Java的反射机制,而是通过生成目标类的子类来实现代理,因此在性能上通常优于基于接口的JDK动态代理。 CGlib动态代理的核心类包括`Enhancer`、`Callback`和`...
1. cglib-2.2.jar:这是CGLIB的核心库,包含了生成代理类所需的主要类和接口。例如,`net.sf.cglib.proxy.Enhancer`是CGLIB中最常用的类,它可以用来创建代理对象。同时,`net.sf.cglib.core.Predicate`和`...
这种方法相比JDK自带的java.lang.reflect.Proxy,具有更高的性能,因为JDK的动态代理只能针对实现了接口的类,而CGlib则可以针对任何类,无论其是否实现了接口。 在描述中提到的"cglib-nodep-3.2.5.jar"是CGlib的...
这种方法比使用Java代理(Proxy)来实现更灵活,因为Java代理只能针对实现了接口的类进行代理,而CGLIB可以处理任何类。 在**cglib-nodep-2.2.jar** 的压缩包中,除了库本身,还包含了一个名为`cglib-2.2-license....
- **JDK动态代理**:利用JDK自身提供的Proxy类和InvocationHandler接口,通过反射机制创建代理对象。 - **CGLIB动态代理**:使用CGLIB库,对类进行字节码增强,生成新的子类。 - **动态代理示例**: ```java //...
ProxyToys用来代理生成,就像Jakarta Commons Logging用来记录日志一样-一种用于代理创建的精简实现中立API。 使用标准代理还是使用CGLIB是单行代码更改。特征API兼容的代理工厂提供者: JDK的标准代理CGLIB实施...
- `hibernate-cglib-repack-2.1_3.jar` 用于代理类的生成,通常在没有Java代理(JDK Proxy)支持的情况下使用。 - `hibernate-commons-annotations.jar` 提供了JPA和Hibernate特定的注解。 - `hibernate-search-...
主要有两种代理方式:基于接口的JDK动态代理和基于类的CGLIB代理。 接下来,我们将详细探讨五种事务管理配置方式: ### 第一种:每个Bean都有一个代理 在这种方式中,每个需要事务管理的Bean都会被一个事务代理...
Spring AOP支持两种类型的代理:JDK动态代理和CGLIB代理。前者基于接口,适用于有接口的目标对象;后者通过字节码技术创建子类,适用于无接口或不希望修改原有代码的情况。 在实际应用中,开发者通常通过XML配置或...
前者在对象被创建时创建代理对象,后者则在类加载阶段进行编织,通常在使用JDK动态代理或CGLIB时采用前者,在使用AspectJ时采用后者。 `aop`和`aspects`涉及的是Spring AOP的实现和使用。`aop`模块包含了Spring AOP...
- Spring使用JDK动态代理或者CGLIB动态代理技术来创建代理对象。 - 当目标对象实现了一个或多个接口时,Spring会使用JDK动态代理;如果目标对象没有实现任何接口,则使用CGLIB动态代理。 3. **配置示例:** - ...
Mybatis通过动态代理(如Java的JDK Proxy或CGLIB)创建SqlSession的代理对象,这个代理对象在执行SQL操作时会进行一系列的预处理和后处理,如事务控制、缓存处理等。 **日志模块分析**: Mybatis的日志模块具有灵活...
4. 代理(Proxy):Spring使用代理模式实现AOP,它可以是JDK动态代理或CGLIB代理,根据目标对象是否实现了接口决定。 在压缩包中,有三个子文件分别对应Spring的不同使用场景: 1. "Spring只用IOC的jar包":这个包...
在Spring中,AOP通过两种代理模式实现:JDK动态代理和CGLIB代理。JDK动态代理基于接口,适用于目标对象实现了接口的情况;而CGLIB代理则是在没有接口的情况下,通过字节码技术创建子类来实现代理,适用于目标对象为...
Not Using Commons Logging ................................................................... 12 Using SLF4J ..............................................................................................
Not Using Commons Logging ................................................................... 12 Using SLF4J ..............................................................................................