`
aaa1aaaaa
  • 浏览: 10115 次
  • 性别: Icon_minigender_1
  • 来自: 江西
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

动态代理-->cglib

 
阅读更多

cglib是一个强大的高性能的代码生成包,他广泛的被许多的AOP框架使用,例如Spring AOP 和dynaop ,为他们提供方法的拦截(interception),最流行的OR Mapping 工具hibernate也使用CGLIB来代理单端single-ended(多对一和一对一)关联。在这里要说明的是,jdk提供了动态代理功能,但是被代理类必须要有接口,否则是生成不了代理的,但是cglib生成代理时,不需要目标类有接口,因为它借助了asm直接修改class文件的字节码。

就这个动态代理说开来,其实spring的aop不是什么神秘的东西,就是借助动态代理来实现的,并且spring内置了两种代理生成方式,一个就是jdk动态代理API,一个就是cglib。典型的spring组件如声明式的事务管理,通知等。spring的IOC更简单,根据配置文件反射而已。这些东西自己实现并不是什么难事,但是要做到spring那样完善和庞大就是另外一回事了。spring提供的测试框架的mock模块当然也是利用了动态代理的。

下面看看demo吧,具体可自行查阅cglib文档
①:创建一个简单的类,注意该类不能声明为final

QueryDAO.java

package com.cglib.proxy;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @version 1.0
 * @history
 */
public class QueryDAO {

    
    @SuppressWarnings("unchecked")
    public List executeQuery(String userName) throws Exception{
        List list = this.queryForList(userName);
        return list;
    }
    
    
    @SuppressWarnings({ "unchecked", "static-access" })
    public List queryForList(String userName){
        try {
            Thread.currentThread().sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Map<String,String> paramMap = new HashMap<String, String>();
        paramMap.put("userName", userName);
        List list = new ArrayList();
        list.add(paramMap);
        return list;
    }
}



②:创建性能检测类PerformanceMonitor,需要实现MethodInterceptor(方法拦截)
PerformanceMonitor.java

package com.cglib.proxy;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

/**
 * @version 1.0
 * @history
 */
public class PerformanceMonitor implements MethodInterceptor {

    private Object target;
    private Enhancer enhander = new Enhancer();

    public Object createProxy(Object target){
        this.target = target;
        enhander.setSuperclass(target.getClass()); //指定父类
        enhander.setCallback(this); //回调当前类
        return enhander.create(); //创建代理类实例
    }


    public Object intercept(Object arg0, Method method, Object[] param,
            MethodProxy proxyMethod) throws Throwable {
        long startTime = System.currentTimeMillis(); //开始时间
        Object result = method.invoke(this.target, param);  //反射回调方法
        long endTime = System.currentTimeMillis(); //结束时间
        System.out.println("执行该方法所需时间:" + (endTime-startTime)+"毫秒" );
        return result;
    }

}



③:Cglib代理类测试效果:
CglibProxyTest.java

package com.cglib.proxy;

public class CglibProxyTest {

    /**
     * @param args
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        QueryDAO target = new QueryDAO(); //声明被代理类
        PerformanceMonitor performance = new PerformanceMonitor();
        QueryDAO dao = (QueryDAO)performance.createProxy(target);
        dao.executeQuery("admin");
    }

}



输入结果
执行该方法所需时间:187毫秒
分享到:
评论

相关推荐

    spring-cglib-repack-3.2.0.jar和spring-objenesis-repack-2.1.jar

    总的来说,`spring-cglib-repack-3.2.0.jar`和`spring-objenesis-repack-2.1.jar`是Spring框架正常运行的关键组成部分,它们分别负责动态子类生成和无参构造函数对象的快速实例化,对于理解和优化Spring应用的性能有...

    代理模式-静态动态代理-jdk动态代理-cglib动态代理

    在Java中,代理模式有多种实现方式,包括静态代理、JDK动态代理和CGLIB动态代理。 **静态代理** 静态代理是最早也是最基础的代理实现方式。在静态代理中,我们需要创建一个代理类,这个代理类与原始类(被代理类)...

    spring-cglib-repack-3.2.5.jar,spring-objenesis-repack-2.6.ja及ck-2.5.1.jar

    "spring-cglib-repack-3.2.5.jar"、"spring-objenesis-repack-2.6.jar"和"spring-objenesis-repack-2.5.1.jar"这三个文件是Spring源码阅读环境中常用的依赖包,它们各自承担着不同的功能。 首先,我们来看"CGLIB"...

    spring-cglib-repack-3.2.4.jar和spring-objenesis-repack-2.5.1.jar

    在深入理解`spring-cglib-repack-3.2.4.jar`和`spring-objenesis-repack-2.5.1.jar`这两个jar包之前,我们先来了解一下Spring框架的核心概念。 Spring框架的核心包括依赖注入(Dependency Injection,DI)和面向切...

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

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

    spring-cglib-repack-3.2.6.jar和spring-objenesis-repack-2.6.jar

    在提供的文件中,我们看到了两个与Spring相关的库:`spring-cglib-repack-3.2.6.jar` 和 `spring-objenesis-repack-2.6.jar`。这两个库都是Spring框架的重要组成部分,用于解决特定的编程问题。 首先,让我们来了解...

    spring-cglib-repack-3.2.5.jar,spring-objenesis-repack-2.6.jar

    标题中的"spring-cglib-repack-3.2.5.jar"和"spring-objenesis-repack-2.6.jar"是Spring框架在运行时依赖的两个关键库,它们主要涉及到动态代理和对象创建的优化。 1. **CGLIB(Code Generation Library)**: ...

    spring-cglib-repack-3.2.6.jar,spring-objenesis-repack-2.6.jarspring-cglib-repack

    总的来说,`spring-cglib-repack-3.2.6.jar` 和 `spring-objenesis-repack-2.6.jar`是Spring框架的核心组成部分,它们提供了代理和对象实例化的底层支持。在进行Spring源码学习或开发时,确保这两个库的正确引入是至...

    spring导入eclipse时少的spring-cglib-repack-3.2.4.jar和spring-objenesis-repack-2.4.jar

    总之,`spring-cglib-repack-3.2.4.jar`和`spring-objenesis-repack-2.4.jar`在Spring框架中扮演着核心角色,主要负责AOP代理和复杂对象的实例化。了解这些库的作用和使用方法,有助于更好地理解和优化Spring应用。

    spring-cglib-repack-3.1.jar,spring-objenesis-repack-2.1.jar

    首先,"spring-cglib-repack-3.1.jar"是一个针对CGLIB(Code Generation Library)的打包版本,用于在运行时动态创建Java类的子类。CGLIB是一个强大的代码生成库,常被用作Java代理机制,尤其在Spring AOP(面向切面...

    spring-cglib-repack-3.2.5.jar和spring-objenesis-repack-2.6.jar

    标题中的"spring-cglib-repack-3.2.5.jar"和"spring-objenesis-repack-2.6.jar"是两个与Spring框架相关的库文件,它们主要用于Spring框架的内部实现,尤其是针对Java对象的创建和代理机制。下面将详细解释这两个库的...

    强势推送cglib-full-2.0及cglib-full-2.0.2

    在这里,我们有两个版本,即cglib-full-2.0和cglib-full-2.0.2。通常,更新的版本修复了旧版本中的bug,可能提供了新的特性和性能优化。从2.0到2.0.2,可能会包含一些稳定性改进和兼容性调整。 5. **使用步骤** -...

    hibernate-cglib-repack-2.1_3.jar

    总的来说,"hibernate-cglib-repack-2.1_3.jar"是Hibernate框架中不可或缺的一部分,它通过CGLIB库实现了对Java类的动态代理,提供了诸如懒加载、拦截器等高级功能,极大地增强了ORM的灵活性和可扩展性。在实际开发...

    hibernate-cglib-repack-2.1_3.jar.zip

    《深入理解Hibernate-CGLIB-2.1_3在Java开发中的应用》 在Java开发领域,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。而CGLIB则是一个代码生成库,它允许开发者在运行时动态创建子类...

    spring-cglib-repack-3.2.5.jar spring-objenesis-repack-2.5.1.jar

    总结,"spring-cglib-repack-3.2.5.jar" 和 "spring-objenesis-repack-2.5.1.jar" 是Spring框架中的重要组件,它们分别负责动态代理和无参实例化。了解这两个库的工作原理以及如何根据源码生成jar包,对于深入理解和...

    Spring源码缺失的spring-cglib-repack-3.2.6.jar和spring-objenesis-repack-2.6.jar

    在Spring框架中,`spring-cglib-repack-3.2.6.jar`和`spring-objenesis-repack-2.6.jar`是两个重要的依赖库,它们在Spring源码环境中扮演着不可或缺的角色。本文将详细介绍这两个库以及它们在Spring框架中的作用。 ...

    spring-cglib-repack-3.2.0.jar和spring-objenesis-2.2.jar

    总的来说,"spring-cglib-repack-3.2.0.jar"和"spring-objenesis-2.2.jar"是Spring框架中的关键组件,它们负责动态代理的实现,提高了代码的灵活性和可测试性。对这两个库的理解有助于提升对Spring框架整体运作机制...

    proxool-0.9.1.jar proxool_cglib-0.9.1.jar

    "proxool-0.9.1.jar" 和 "proxool_cglib-0.9.1.jar" 是针对数据库连接池的Java库,其中Proxool负责管理数据库连接,而CGLIB提供了动态代理功能,帮助实现Proxool的核心功能。这两个库的使用需要配置合适的参数以适应...

    spring-cglib-repack 资源

    在本资源包中,包含的是针对此类问题的解决方案——`spring-cglib-repack`和`spring-objenesis-repack`。 首先,`CGLIB`(Code Generation Library)是一个强大的高性能的代码生成库,它在许多AOP(面向切面编程)...

Global site tag (gtag.js) - Google Analytics