it167.com  设为主页
 收藏本站
 
  资讯:业界动态 | 软件动态 | 人物专栏 | 安全资讯 | 网络生活 | 电子商务 | 小游戏 | 视频 | 美女图片 | 音乐
  网络编程 | 网站运营 | 网页制作 | 图形图象 | 操作系统 | 媒体动画 | 软件教学 | 网络应用 | 邮件系统 | 网络安全 | 认证考试
asp | .net | php | jsp | Sql | java | Dreamweaver | FrontPages | Javascript | css | Coreldraw | photoshop | Flash | Coreldraw
当前位置: > 主页>网络编程>Java>JAVA实例教程>Java下的框架编程之cglib的应用
最新新闻

·机会与整合 边缘化互联
·TOM-Skype新增三大本地
·雅虎抢闸邮箱竞赛 网易
·新浪抢攻北京奥运
·洞悉网络口碑的掘金机会
·拆解网络病毒黑金交易
·木马下载器近期出现新变
·《互联网周刊》第17期文
·Web2.0是否催生自吹自擂
·三张宝宝裸照招来MSN封
热门新闻
·jsp 下实现防止重复在线
·一个必看的Java程序
·存储过程
·构建自己的基于Java的超
·构建自己的基于Java的超
·Web应用中的中文问题
·学习MySQL常用操作命令
·MySQL中修改密码及访问
·Hibernate 3新增XML关系
·java实现ftp下载文件
推荐新闻
 
 

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

作者:   来源:it167   点击:   日期:2007-01-28

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

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

它的原理就是用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。

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

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

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

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,

MethodProxy proxy) throws Throwable

{

log.info(
"调用日志方法"+method.getName());

Object result
=proxy.invokeSuper(o,args);

return result;

}

}



应用的代码:

LogDAOProxy proxy = new LogDAOProxy();

GoodsDAO  dao 
= (GoodsDAO)proxy.getDAO(GoodsDAO.class);

dao.insert(goods);



2.而在Spring的管理下应该略加修改的高级Decorator

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

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;

}

}



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

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





文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【论坛讨论

   相关文章:
·毫无意义的Java基础类恶作剧 ·在JAVA中连接Sybase数据库的例子
·基于Struts技术的Web应用设计与实现 ·Struts的动态复选框
·在Eclipse中开发struts应用程序 ·创建基于Struts的Web应用程序

   文章评论:(0条)
  
 请留名: 匿名评论   点击查看所有评论 网管论坛
 

  责任编辑:it167  声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。