`
java_min
  • 浏览: 58833 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

cglib 笔记

    博客分类:
  • IT
阅读更多
反射、Proxy和元数据是Java最强的三个特征,再加上CGLib (Code Generation Library)和ASM,使得Java虽然没有Ruby,Python般后生可畏,一样能做出强悍的框架。
   Proxy可以看作是微型的AOP,明白提供了在继承和委托之外的第三个代码封装途径,Spring的源码里用Proxy就用得很随意。但是Proxy必须基于接口。因此Spring的做法,基于接口的用proxy,否则就用cglib。AOP么,一般非compoent级的就不必用AspectJ。
        它的原理就是用Enhancer生成一个原有类的子类,并且设置好callback到proxy, 则原有类的每个方法调用都会转为调用实现了MethodInterceptor接口的proxy的intercept() 函数:
public Object intercept(Object o,Method method,Object[] args,MethodProxy proxy)
在intercept()函数里,你可以在执行Object result=proxy.invokeSuper(o,args);来执行原有函数,在执行前后加入自己的东西,改变它的参数值。其实就是AOP中的around advice。

public class DaoProxyUtil implements MethodInterceptor {

private Enhancer enchancer = new Enhancer();

private static final String PROXY_TYPE = "CGLIB";

//返回Dao子类
@SuppressWarnings("rawtypes")
public Object getDao(Class clazz){
enchancer.setSuperclass(clazz);
enchancer.setCallback(this);
return enchancer.create();
}

//默认的拦截方法
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
new CheckUtil().checkAuthentication(obj,method.getName(),args,PROXY_TYPE);
Object result = proxy.invokeSuper(obj, args);
return result;
}

}


也可以加强代码改为如下格式:
public class LogDAOProxy implements MethodInterceptor
  {
       private Logger log=Logger.getLogger(LogDAOProxy.class);
       private Object dao=null;
       private Enhancer enhancer=new Enhancer();
        //返回DAO的子类
       public Object getDAO(Class clz,Object dao)
       {
           this.dao = dao;
           enhancer.setSuperclass(clz);
           enhancer.setCallback(this);
           return enhancer.create();
       }     
       //默认的拦截方法
      public Object intercept(Object o,Method method,Object[] args,MethodProxy proxy) throws Throwable
      {
           log.info("调用日志方法"+method.getName());
           Object result=proxy.invoke(dao, args);
           return result;
      }
  }
分享到:
评论

相关推荐

    cglib.zip

    CGLIB,全称为Code Generation Library,是一个强大的Java代码生成库,广泛用于动态代理、AOP(面向切面编程)等领域。在Java世界中,CGLIB是Spring AOP框架的重要组成部分,它通过字节码技术为类创建子类,进而实现...

    Spring学习笔记(14)----使用CGLIB实现AOP功能

    在本篇Spring学习笔记中,我们将探讨如何使用CGLIB库来实现AOP功能。 CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,它被广泛用于动态代理和运行时织入AOP切面。在Spring中,如果目标类没有...

    韩顺平.2011版.hibernate笔记.zip

    7. Criteria API与CGLIB代理:Hibernate在处理懒加载时会用到CGLIB代理,这部分内容可能会涉及到如何使用CGLIB和Hibernate结合,以实现透明的懒加载机制。 8. 集合映射与关联管理:Hibernate支持多种集合类型的映射...

    Spring技术内幕 学习笔记

    AOP通过代理模式实现,有JDK动态代理和CGLIB两种方式。学习笔记可能涉及如何定义切面(Aspect)、通知(Advice)和切入点表达式(Pointcut),以及如何配置和使用AOP代理。 Spring MVC是Spring框架中的Web层组件,...

    spring学习笔记(十三)

    【标题】"Spring学习笔记(十三)"主要涉及的是Spring框架中的AOP(面向切面编程)部分,特别是关于CGLIB动态代理的实现。在Spring中,AOP是一种强大的编程模型,它允许开发者定义“切面”,即关注点的模块化,如日志...

    spring学习笔记(十四)

    【标题】"Spring学习笔记(十四)"主要涵盖了Spring框架中的AOP(面向切面编程)和CGLIB库的应用,这两个知识点在Java开发中尤为重要,尤其是对于构建灵活、可维护的大型企业级应用。 首先,Spring框架是Java开发中...

    Spring高级源码学习笔记.zip

    AOP代理有两种实现方式:JDK动态代理和CGLIB。前者针对实现了接口的类,后者则在没有接口的情况下通过子类化目标类实现。源码中,Advised接口和ProxyFactoryBean扮演着关键角色。 在数据访问/集成方面,Spring提供...

    Spring编程学习笔记

    ### Spring编程学习笔记知识点概述 #### 一、Spring框架简介 Spring框架是一个开源的轻量级Java开发框架,主要用于简化企业级应用的开发工作。它提供了全面的基础架构支持,包括但不限于依赖注入(Dependency ...

    spring学习笔记(八)

    【标题】"Spring学习笔记(八)"主要涵盖了Spring框架中的动态代理机制,这是Spring AOP(面向切面编程)的核心技术之一。动态代理允许我们在不修改原有代码的情况下,为对象添加额外的功能,如日志、事务管理等。在这...

    黑马程序员 hibernate 2016版讲义和笔记(4天全)

    此外,还可以探讨CGLIB和ASM动态代理,以及Hibernate的事件监听机制。 通过这4天的学习,你将对Hibernate有深入的理解,并能够熟练地在项目中应用。记住,理论知识结合实践才能真正掌握,因此,尝试在实际项目中...

    java设计模式源码和笔记(第一部分)

    Java中可以通过静态代理和动态代理(JDK或CGLIB)实现。笔记可能详细描述了代理的生成和调用流程。 6. **适配器模式**:将一个类的接口转换成客户希望的另一个接口。在Java中,适配器可以是类或接口的形态。源码...

    spring aop 学习笔记

    本学习笔记将深入探讨Spring AOP的核心概念、工作原理以及实际应用。 1. **核心概念** - **切面(Aspect)**:切面是关注点的模块化,包含业务逻辑之外的横切关注点,如日志、事务管理。 - **连接点(Join Point...

    Spring的学习笔记

    以下将详细介绍Spring学习笔记中的主要知识点。 **面向抽象编程** 面向抽象编程是一种设计原则,强调在代码中使用接口或抽象类,而不是具体实现类。这使得系统更具有灵活性,易于扩展和维护。在Spring框架中,我们...

    spring第一次课笔记

    本笔记将详细解析Spring框架的基础知识,帮助你更好地理解并掌握Spring的核心概念。 首先,我们需要了解Spring框架的主要模块: 1. **核心容器**:这是Spring框架的基础,包括BeanFactory和ApplicationContext。...

    《Spring3.1 和 MyBatis 整合笔记 》源代码(第二版)

    Spring3.1是Spring框架的一个重要版本,它引入了若干改进,如CGLIB的默认启用,增强了对JSR-330依赖注解的支持,以及对Groovy配置的支持等。 MyBatis则是一个轻量级的持久层框架,它简化了SQL操作,允许开发者直接...

    Spring IOC 笔记

    Spring 支持代理模式实现 AOP,可以是 JDK 动态代理或 CGLIB 代理。 ### Spring 源码分析 深入理解 Spring 源码有助于我们更好地利用和定制框架。例如,`DefaultListableBeanFactory` 类是 BeanFactory 的实现,...

    hibernate框架学习笔记整理

    ### hibernate框架学习笔记整理 #### 一、Hibernate框架简介 **Hibernate框架**是一种用于Java应用的**对象关系映射**(Object-Relational Mapping, ORM)解决方案,它允许开发者使用面向对象的方式操作数据库中的表...

    Spring学习笔记1

    在本篇Spring学习笔记中,我们将深入探讨Spring的几个关键知识点,包括其优点、AOP的实现原理以及声明式事务管理。 首先,Spring的优点在于它的轻量级特性,它不对现有类结构造成入侵,允许开发者专注于业务逻辑。...

    SSH笔记-AOP

    SSH笔记主要围绕的是Spring框架中的AOP(面向切面编程)特性进行讲解,结合了动态代理和基于注解的配置方式。AOP是Spring框架的一个重要组成部分,它提供了一种模块化和解耦代码的方式,使得我们可以将关注点分离到...

    Hibernate学习笔记源码及文档

    学习笔记涵盖了Hibernate的基础概念、配置、实体类的创建、数据类型映射、关系映射(一对一、一对多、多对多)、查询语言HQL、 Criteria API、CGLIB动态代理等核心内容。笔记详细记录了每个知识点的原理和实践步骤...

Global site tag (gtag.js) - Google Analytics