本系列文章均整理自我在先前一家公司的CGLib使用总结和笔记。分享出来,希望对看到的人有所帮助,同时欢迎大家提出宝贵意见。如需转载,请勿修改,且注明作者shensy及出处。
--------------------------------------
实战CGLib系列文章
本篇介绍改进版延迟加载器Dispatcher。
一、作用:
上一篇文章中,介绍了延迟加载器LazyLoader。本篇介绍另一种延迟加载接口Dispatcher。
Dispatcher接口同样继承于Callback,也是一种回调类型。
但是Dispatcher和LazyLoader的区别在于:LazyLoader只在第一次访问延迟加载属性时触发代理类回调方法,而Dispatcher在每次访问延迟加载属性时都会触发代理类回调方法。
二、示例:
与上篇文章相同,先定义一个实体类DispatcherBean,该Bean内有一个需要延迟加载的属性PropertyBean。PropertyBean的代码与上一篇相同,这里只看一下DispatcherBean:
public class DispatcherBean { private String name; private String value; private PropertyBean propertyBean; public DispatcherBean(){ this.name="DispatcherBean"; this.value="abc"; this.propertyBean=createDispatcherBean(); } protected PropertyBean createDispatcherBean(){ Enhancer enhancer=new Enhancer(); enhancer.setSuperclass(PropertyBean.class); return (PropertyBean)enhancer.create(PropertyBean.class,new ConcreteClassDispatcher()); } //setter/getter }
同样对propertybean生成了代理类,回调类ConcreteClassDispatcher实现了Dispatcher接口,如下:
public class ConcreteClassDispatcher implements Dispatcher{ public Object loadObject() throws Exception { System.out.println("Dispatcher loadObject ..."); PropertyBean object=new PropertyBean(); object.setPropertyName("PropertyBeanName!"); object.setPropertyValue(1); return object; } }
验证延迟加载:
DispatcherBean dispatcherBean=new DispatcherBean(); System.out.println(dispatcherBean.getName()); System.out.println(dispatcherBean.getValue()); PropertyBean pb=dispatcherBean.getPropertyBean(); System.out.println(pb.getPropertyName()); //在每次访问时都要进行回调 System.out.println(pb.getPropertyValue());
控制台输出:
DispatcherBean abc Dispatcher loadObject ... PropertyBeanName! Dispatcher loadObject ... 1
由此可见,每次获取property bean的属性都会自动触发回调方法加载对象。
结束语:
以上就是CGLib中Dispatcher延迟加载的一个示例,本系列下一篇将继续介绍CGLib的强大功能,敬请期待。
相关推荐
Maven坐标:cglib:cglib-nodep:3.1; 标签:cglib、nodep、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变...
Maven坐标:cglib:cglib:3.1; 标签:cglib、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明...
Maven坐标:cglib:cglib-nodep:3.2.4; 标签:cglib、nodep、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持...
Spring系列第12篇:lazy-init:bean延迟初始化Spring系列第13篇:使用继承简化bean配置(abstract & parent)Spring系列第14篇:lookup-method和replaced-method比较陌生,怎么玩的?Spring系列第15篇:代理详解(Java...
在java编程使用CGLIB做动态代理时需要CGLIB依赖包支持,没有这个支持包,当导入import net.sf.cglib.proxy.Enhancer;或者import net.sf.cglib.proxy.MethodProxy;类似包时会提示错误,所以分享出来同大家共勉。
Cglib的jar文件,包含:asm.jar、asm-commons.jar、asm-tree.jar、cglib-2.2.jar 四个jar包
Maven坐标:cglib:cglib-nodep:3.1; 标签:cglib、nodep、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持...
Maven坐标:cglib:cglib:3.3.0; 标签:cglib、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明...
Maven坐标:cglib:cglib:3.3.0; 标签:cglib、jar包、java、中英对照文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和...
CGLIB介绍与原理(部分节选自网络) ...四、CGLIB的API 1、Jar包: cglib-nodep-2.2.jar:使用nodep包不需要关联asm的jar包,jar包内部包含asm的类. cglib-2.2.jar:使用此jar包需要关联asm的jar包,否则运行时报错.
CGLIB简介CGLIB简介CGLIB简介CGLIB简介CGLIB简介
cglib-3.2.5.jar、cglib-nodep-3.2.5.jar、cglib-RELEASE_3_2_5.tar.gz(源码)、cglib-RELEASE_3_2_5.zip(源码)
cglib-3.2.5.jar的jar包 十分好用的一个动态代理包
package com.gc.cglib下为:aop方式cglib代理 package com.gc.dynproxy下为:aop方式动态代理 package com.gc.javaproxy下为:java代理机制实现 package com.gc.proxy下为:自定义代理模式(面向接口编程) ...
Maven坐标:cglib:cglib-nodep:3.2.4; 标签:cglib、nodep、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...
at net.sf.cglib.core.ReflectUtils.getMethodInfo(ReflectUtils.java:424) at net.sf.cglib.beans.BeanCopier$Generator.generateClass(BeanCopier.java:133) at ...
cglib.jar 和 asm.jar 对应版本
cglib包及依赖汉cglib3.1和asm4.2,主要作用是用户代理,代理为控制要访问的目标对象提供了一种途径。当访问对象时,它引入了一个间接的层。JDK自从1.3版本开始,就引入了动态代理,并且经常被用来动态地创建代理。...
cglib就是封装了asm,简化了asm的操作,实现了在运行期动态生成新的class。
Cglib最新版本的2个jar包,分别是cglib-3.3.0.jar和cglib-nodep-3.3.0.jar,压缩后上传,方便大家使用。