`

Java下的框架编程之cglib的应用

阅读更多
Proxy可以看作是微型的AOP,明白提供了在继承和委托之外的第三个代码封装途径,只要有足够的想象力,可以做得非常好玩,Spring的源码里用Proxy就用得很随便,看得我非常眼红。可惜Proxy必须基于接口。因此Spring的做法,基于接口的用proxy,否则就用cglib。AO

 

Proxy可以看作是微型的AOP,明白提供了在继承和委托之外的第三个代码封装途径,只要有足够的想象力,可以做得非常好玩,Spring的源码里用Proxy就用得很随便,看得我非常眼红。可惜Proxy必须基于接口。因此Spring的做法,基于接口的用proxy,否则就用cglib。AOP么,一般小事非compoent一级的就不麻烦AspectJ出手了。 copyright 领测软件测试网

cglib的Enhancer说起来神奇,用起来一页纸不到就讲完了。

ltesting.net

 

它的原理就是用Enhancer生成一个原有类的子类,并且设置好callback到proxy, 则原有类的每个方法调用都会转为调用实现了MethodInterceptor接口的proxy的intercept() 函数: copyright 领测软件测试网

 

public Object intercept(Object o,Method method,Object[] args,MethodProxy proxy) 领测软件测试网http://www.ltesting.net

内容来自ltesting.net
内容来自ltesting.net

 

在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是这样做的:

copyright 领测软件测试网

 

 

public class LogDAOProxy implements MethodInterceptor { private Logger log=Logger.getLogger(LogDAOProxy.class); private Enhancer enhancer=new Enhancer(); //返回DAO的子类        public Object getDAO(Class clz) { enhancer.setSuperclass(clz); enhancer.setCallback(this); return enhancer.create(); } //默认的拦截方法       public Object intercept(Object o,Method method,Object[] args, http://www.ltesting.net

 

MethodProxy proxy) throws Throwable { log.info("调用日志方法"+method.getName()); Object result=proxy.invokeSuper(o,args); return result; } }

http://www.ltesting.net

 

copyright 领测软件测试网
领测软件测试网


应用的代码:

ltesting.net

 

 

LogDAOProxy proxy = new LogDAOProxy(); GoodsDAO  dao = (GoodsDAO)proxy.getDAO(GoodsDAO.class); dao.insert(goods);

内容来自ltesting.net

 

http://www.ltesting.net



2.而在Spring的管理下应该略加修改的高级Decorator 内容来自ltesting.net

 

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

领测软件测试网

 

可见,原来模式里在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);

http://www.ltesting.net

 

(责任编辑 火凤凰 sunsj@51cto.com  TEL:(010)68476636-8007)

ltesting.net

 


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,

ltesting.net

 

MethodProxy proxy) throws Throwable { log.info("调用日志方法"+method.getName()); Object result=proxy.invoke(dao, args); return result; } }

copyright 领测软件测试网

 

copyright 领测软件测试网

http://www.ltesting.net



本文标题:Java下的框架编程之cglib的应用http://www.ltesting.net/ceshi/ruanjianceshikafajishu/rjcskfyy/java/2007/0611/40937.html

分享到:
评论

相关推荐

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

    Spring不仅能应用于J2EE应用程序中,也可以用于桌面应用程序以及小应用程序之中。 Spring框架主要由七部分组成,分别是Spring Core,Spring AOP,Spring ORM,Spring DAO,Spring Context,Spring Web和Spring Web MVC。

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

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

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

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

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

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

    Java 动态代理.md

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

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

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

    我的博客园

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

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

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

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

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

    Spring3注解

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

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

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

    spring4.3.9相关jar包

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

    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. ...

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    JoyAop-开源

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

    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-...

    Spring 2.0 开发参考手册

    7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”advisor 7.6. 简化代理定义 7.7. 使用ProxyFactory通过编程创建AOP代理 7.8. 操作被通知对象 7.9. 使用“自动...

    lagou-transfer:Spring框架大作业

    编程题: 自定义注解: @Component 添加在类上,value属性用于设置bean的id,默认值为"" @Autowired 添加在属性上,只实现了根据类型注入,即若属性是接口类型,需要该接口的实现类唯一,才可以注入 @Transactional ...

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

    7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”advisor 7.6. 简化代理定义 7.7. 使用ProxyFactory通过编程创建AOP代理 7.8. 操作被通知对象 7.9. 使用“自动代理...

    Spring中文帮助文档

    7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”通知器 7.6. 简化代理定义 7.7. 使用ProxyFactory通过编程创建AOP代理 7.8. 操作被通知对象 7.9. 使用“自动...

Global site tag (gtag.js) - Google Analytics