Java框架编程之cglib的应用(2)
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;
}(www.iocblog.net 文章来源)
}
{
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;
}(www.iocblog.net 文章来源)
}
可见,原来模式里在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);
Tag: cglib
文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。