`
icheng
  • 浏览: 833939 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
文章分类
社区版块
存档分类
最新评论

Java下的框架编程(5)--cglib的应用

 
阅读更多
反射、Proxy和元数据是Java最强的三个特征,再加上CGLib (Code Generation Library)和ASM,使得Java虽然没有Ruby,Python般后生可畏,一样能做出强悍的框架。
Proxy可以看作是微型的AOP,明白提供了在继承和委托之外的第三个代码封装途径,只要有足够的想象力,可以做得非常好玩,Spring的源码里用Proxy就用得很随便,看得我非常眼红。可惜Proxy必须基于接口。因此Spring的做法,基于接口的用proxy,否则就用cglib。AOP么,一般小事非compoent一级的就不麻烦AspectJ出手了。

cglib的Enhancer说起来神奇,用起来一页纸不到就讲完了。
它的原理就是用Enhancer生成一个原有类的子类,并且设置好callback到proxy, 则原有类的每个方法调用都会转为调用实现了MethodInterceptor接口的proxy的intercept()函数:
publicObjectintercept(Objecto,Methodmethod,Object[]args,MethodProxyproxy)

在intercept()函数里,你可以在执行Object result=proxy.invokeSuper(o,args);来执行原有函数,在执行前后加入自己的东西,改变它的参数值,也可以瞒天过海,完全干别的。说白了,就是AOP中的around advice。

AOP没有出现以前,该领域经典的设计模式是Decorator,像Java IO Stream的设计就是如此.不过,如果为每个DAO, 每个方法的写Decorator函数会写死人的,所以用上cglib的好处是一次过拦截所有方法。

另外,cglib除了Enhancer之外,还有BulkBean和Transform,都是Hibernate持久化的基础,但文档贫乏,一时还没去看怎么用。

1.AOP里讲了一百遍阿一百遍的log aspect在cglib是这样做的:


publicclassLogDAOProxyimplementsMethodInterceptor
{
privateLoggerlog=Logger.getLogger(LogDAOProxy.class);
privateEnhancerenhancer=newEnhancer();
//返回DAO的子类
publicObjectgetDAO(Classclz)
{
enhancer.setSuperclass(clz);
enhancer.setCallback(
this);
returnenhancer.create();
}
//默认的拦截方法
publicObjectintercept(Objecto,Methodmethod,Object[]args,MethodProxyproxy)throwsThrowable
{
log.info(
"调用日志方法"+method.getName());
Objectresult
=proxy.invokeSuper(o,args);
returnresult;
}
}

应用的代码:
LogDAOProxyproxy=newLogDAOProxy();
GoodsDAOdao
=(GoodsDAO)proxy.getDAO(GoodsDAO.class);
dao.insert(goods);

2.而在Spring的管理下应该略加修改的高级Decorator
上面的例子用returnenhancer.create();创建子类实例,但在Spring管理下,一些Bean的实例必须由Spring来创建和管理,而不由enhancer来创建的。所以我对上述用法略加修改,使它真正当一个Proxy的角色,请对比黑体字的部分


publicclassLogDAOProxyimplementsMethodInterceptor
{
privateLoggerlog=Logger.getLogger(LogDAOProxy.class);
privateObjectdao=null;
privateEnhancerenhancer=newEnhancer();
//返回DAO的子类
publicObjectgetDAO(Classclz,Objectdao)
{
this.dao=dao;
enhancer.setSuperclass(clz);
enhancer.setCallback(
this);
returnenhancer.create();
}
//默认的拦截方法
publicObjectintercept(Objecto,Methodmethod,Object[]args,MethodProxyproxy)throwsThrowable
{
log.info(
"调用日志方法"+method.getName());
Objectresult
=proxy.invoke(dao,args);
returnresult;
}
}

可见,原来模式里在getDao()时由enhancer创建dao,而调用intercept时则将enhancer创建的dao以Object o参数传回。
而新模式里,dao在getDao()时从外面传入,enhancer.create()返回的是一个proxy. 而调用intercept时,实际会用之前传入的dao进行操作,而忽略Object o参数传入的proxy.

有点遗憾, intercept函数里MethodProxy的Signature是固定的 , 即客户如果调用foo(String),你不可以用proxy.invoke偷换成foo(String,String);


系列文章:
Java下的框架编写(1)--序
Java下的框架编程(2)-对泛型的无聊用法和为擦拭法站台
Java下的框架编程(3)--关于反射的碎话
Java下的框架编程(4)--Annotation vs XML vs Interface 最新一Round
Java下的框架编程(5)--cglib应用
Java下的框架编程(6)--asm(待写)
分享到:
评论

相关推荐

    spring源码阅读所需jar spring-cglib-repack-3.2.8.jar 和spring-objenesis-repack-2.6.jar

    Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单...

    Spring框架+Spring工作原理+AOP面向切面编程+JDK代理+Cglib代理

    Spring框架是一个开放源代码的J2EE应用程序框架,是对bean的生命周期进行管理的轻量级容器。 适用:中高级开发 Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork等众多Web框架组合使用,并且可以与Swing...

    【源码:AopFk】如何使用 Java 编写一个简单的 AOP 框架

    AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,它允许程序员以模块化的方式添加功能到应用程序。AOP 框架通过在程序执行的特定时间点插入代码(称之为切面)来实现这一点。 特点: -简单易用:...

    Java 动态代理.md

    动态代理在 Java 中有着广泛的应用,比如 AOP 的实现原理、RPC远程调用、Java 注解对象获取、日志框架、全局性异常处理、事务处理等。 在了解动态代理前,我们需要先了解一下什么是代理模式。 代理模式 代理模式...

    SpringAOP的实现机制(底层原理)、应用场景等详解,模拟过程的实例

    本资源将深入探讨Spring框架中使用的两种关键的动态代理方式:JDK动态代理和CGLib动态代理。这两种代理方式在Spring AOP中起到关键作用,用于实现横切关注点的切面编程。通过学习它们的原理和实际应用,您将能够更好...

    Spring3+Hibernate4+Struts2 jar包 SSH框架

    cglib-2.1.3.jar commons-dbcp.jar commons-fileupload-1.2.2.jar commons-io-2.0.1.jar commons-lang3-3.1.jar commons-logging-1.1.1.jar commons-pool.jar dom4j-1.6.1.jar freemarker-2.3.19.jar google-...

    spring4.3.9相关jar包

    spring-web.jar(必须) :这个jar 文件包含Web 应用开发时,用到Spring 框架时所需的核心类,包括自动载入Web Application Context 特性的类、Struts 与JSF 集成类、文件上传的支持类、Filter 类和大量工具辅助类。...

    小傅哥的字节码编程(公众号:bugstack虫洞栈).pdf

    市面上以及网络搜索中都基本很少有成体系的关于字节码编程的知识,这主要由于大部分开发人员其实很少接触这部分内容,包括;ASM、Javassist、Byte-buddy以及JavaAgent,没有很大的市场也就没有很多的资料。但大家...

    java-advance:java进阶,包含 常用设计模式、线程和并发、spring核心代码、mybatis核心代码、springboot2.0、springcloud G版本、docker的使用、各类面试题

    java进阶源码分析专题常用设计模式线程与并发锁的使用深度理解synchronized、volatile、cas手写ASQSpring5IOC容器设计原理及高级特性AOP设计原理FactoryBean与BeanFactorySpring事务处理机制Spring JDK动态代理...

    我的博客园

    《我的博客园》项目基于MVC设计开发模式,...在数据库访问层中使用面向接口的编程思想,采用MyBatis框架编写的映射器接口和对应的xml文件,进行将数据库中表的一条一条记录和java应用程序中的对象之间相互转化的操作。

    ssh(structs,spring,hibernate)框架中的上传下载

    Tfile的Hibernate映射文件Tfile.hbm.xml放在Tfile .java类文件的相同目录下:  代码 2 领域对象映射文件 1. 2. !DOCTYPE hibernate-mapping PUBLIC 3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4. ...

    Spring3.x企业应用开发实战(完整版) part1

     Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...

    Spring.3.x企业应用开发实战(完整版).part2

     Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...

    spring chm文档

    2.6.4. 对Java 5(Tiger)的支持 2.7. 移植到Spring 2.0 2.7.1. 一些变化 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. 控制反转容器 3.1. 简介 3.2. 容器和bean的基本原理 3.2.1. 容器 3.2.2. ...

    Spring3注解

    AOP(Aspect Orient Programming),也就是面向方面编程,作为面向对象编程的一种补充,专门用于处理系统中分布于各个模块(不同方法)中的交叉关注点的问题,在 Java EE 应用中,常常通过 AOP 来处理一些具有横切...

    Spring-Reference_zh_CN(Spring中文参考手册)

    2.6.4. 对Java 5(Tiger)的支持 2.7. 移植到Spring 2.0 2.7.1. 一些变化 2.7.1.1. Jar包 2.7.1.2. XML配置 2.7.1.3. Deprecated的类和方法 2.7.1.4. Apache OJB 2.7.1.5. iBatis 2.8. 更新的样例应用 2.9. 改进的...

    Spring 2.0 开发参考手册

    2.6.4. 对Java 5(Tiger)的支持 2.7. 移植到Spring 2.0 2.7.1. 一些变化 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. 控制反转容器 3.1. 简介 3.2. 容器和bean的基本原理 3.2.1. 容器 3.2.2. ...

    Spring中文帮助文档

    2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. IoC(控制反转)容器 3.1. 简介 3.2. 基本原理 - 容器和bean 3.2.1. 容器 3.2.2. ...

    Spring API

    2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. IoC(控制反转)容器 3.1. 简介 3.2. 基本原理 - 容器和bean 3.2.1. 容器 3.2.2. ...

    JoyAop-开源

    JoyAop 是 Java 的动态 AOP(面向方面​​编程)框架。 基于CGLIB 代理和方面可以使用抽象模式的概念来实现。 文档:http://joyaop.sourceforge.net

Global site tag (gtag.js) - Google Analytics