实战CGLib之延迟加载LazyLoader
来源:互联网 发布:绿色童年软件下载 编辑:程序博客网 时间:2024/06/04 19:39
本篇介绍延迟加载器LazyLoader。
一、作用:
说到延迟加载,应该经常接触到,尤其是使用Hibernate的时候,本篇将通过一个实例分析延迟加载的实现方式。
LazyLoader接口继承了Callback,因此也算是CGLib中的一种Callback类型。
一、作用:
说到延迟加载,应该经常接触到,尤其是使用Hibernate的时候,本篇将通过一个实例分析延迟加载的实现方式。
LazyLoader接口继承了Callback,因此也算是CGLib中的一种Callback类型。
二、示例:
首先定义一个实体类LoaderBean,该Bean内有一个需要延迟加载的属性PropertyBean。
LoaderBean.java:
- public class LoaderBean {
- private String loaderName;
- private int loaderValue;
- private PropertyBean propertyBean;
- public LoaderBean(){
- this.loaderName="loaderNameA";
- this.loaderValue=123;
- this.propertyBean=createPropertyBean();
- }
- protected PropertyBean createPropertyBean(){
- Enhancer enhancer=new Enhancer();
- enhancer.setSuperclass(PropertyBean.class);
- return (PropertyBean)enhancer.create(PropertyBean.class,new ConcreteClassLazyLoader());
- }
- //setter/getter...
- }
PropertyBean.java:
- public class PropertyBean {
- private String propertyName;
- private int propertyValue;
- //setter/getter
- }
在LoaderBean的构造方法中,对属性Bean进行了代理类生成,使用了CGLib中的LazyLoader回调接口。
- public class ConcreteClassLazyLoader implements LazyLoader{
- public Object loadObject() throws Exception {
- System.out.println("LazyLoader loadObject() ...");
- PropertyBean bean=new PropertyBean();
- bean.setPropertyName("lazy-load object propertyName!");
- bean.setPropertyValue(11);
- return bean;
- }
- }
验证延迟加载:
- LoaderBean loader=new LoaderBean();
- System.out.println(loader.getLoaderName());
- System.out.println(loader.getLoaderValue());
- PropertyBean propertyBean=loader.getPropertyBean();//访问延迟加载对象
- System.out.println(propertyBean.getPropertyName());
- System.out.println(propertyBean.getPropertyValue());
- System.out.println("after...");
- //当再次访问延迟加载对象时,就不会再执行回调了
- System.out.println(propertyBean.getPropertyName());
控制台输出:
- loaderNameA
- 123
- LazyLoader loadObject() ...
- lazy-load object propertyName!
- 11
- after...
- lazy-load object propertyName!
注意,第一次获取property bean的属性时,会触发代理类回调方法。第二次再获取property bean的属性时,就直接返回属性值而不会再次触发代理类回调方法了。
可见,延迟加载原理:
对需要延迟加载的对象添加代理,在获取该对象属性时先通过代理类回调方法进行对象初始化。
在不需要加载该对象时,只要不去获取该对象内属性,该对象就不会被初始化了(在CGLib的实现中只要去访问该对象内属性的getter方法,就会自动触发代理类回调)。
0 0
- 实战CGLib之延迟加载LazyLoader
- 实战CGLib系列之proxy篇(三):延迟加载LazyLoader
- 实战CGLib系列之proxy篇(三):延迟加载LazyLoader
- CGlib之LazyLoader实现延迟加载对象
- 实战CGLib系列之proxy篇(四):改进版延迟加载Dispatcher
- 使用CGLIB轻松实现延迟加载(Lazyload)
- 使用CGLIB轻松实现延迟加载(Lazyload)
- 使用CGLIB轻松实现延迟加载(Lazyload)
- 使用CGLIB轻松实现延迟加载(Lazyload)
- 使用CGLIB轻松实现延迟加载(Lazyload)
- 使用CGLIB轻松实现延迟加载(Lazyload)
- 使用CGLIB轻松实现延迟加载(Lazyload)
- 使用CGLIB轻松实现延迟加载(Lazyload)
- 使用CGLIB轻松实现延迟加载(Lazyload)
- 使用CGLIB轻松实现延迟加载(Lazyload)
- 使用CGLIB轻松实现延迟加载(Lazyload)
- 使用CGLIB轻松实现延迟加载(Lazyload)
- 使用CGLIB轻松实现延迟加载(Lazyload)
- [腾讯校招] 有趣的数字
- python module: collection 的 Counter()
- Http协议格式
- 2016年学习总结【转载】
- Parasoft C++test使用教程:执行测试用例(上)
- 实战CGLib之延迟加载LazyLoader
- linux搭建apache
- 【Unity】sqlite数据库在Unity中的使用
- Android测试(1)
- 1022. D进制的A+B (20)
- xmpp之防止应用升级时下载的文件(语音/图片)失效
- 分布式消息队列RocketMQ源码分析之3 -- Consumer负载均衡机制 -- Rebalance
- 【蓝桥杯题】 之 算法训练-字串统计
- 背景色及背景图片的覆盖范围