实现对象属性的lazy-loading(延迟加载)

一、延迟加载器LazyLoader作用:
       说到延迟加载,应该经常接触到,尤其是使用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方法,就会自动触发代理类回调)。

原文地址:https://www.cnblogs.com/gejuncheng/p/8216045.html

时间: 2024-08-05 01:30:25

实现对象属性的lazy-loading(延迟加载)的相关文章

Lazyr.js – 延迟加载图片(Lazy Loading)

Lazyr.js 是一个小的.快速的.现代的.相互间无依赖的图片延迟加载库.通过延迟加载图片,让图片出现在(或接近))视窗才加载来提高页面打开速度.这个库通过保持最少选项并最大化速度. 在线演示      源码下载 您可能感兴趣的相关文章 网站开发中很有用的 jQuery 效果[附源码] 分享35个让人惊讶的 CSS3 动画效果演示 十分惊艳的8个 HTML5 & JavaScript 特效 Web 开发中很实用的10个效果[源码下载] 12款经典的白富美型 jQuery 图片轮播插件 本文链接

Lazy Load延迟加载图片效果

前些日子自己想搞个延时加载的玩玩,但js自己是不会写的,只有上网找插件了.在网上找了好多,都比较坑爹!为什么呢?大部分文章都是他妹的一篇不停的转载,这地方省一点那地方省一点.你说你转载就算了,保留原出处链接也行啊,这样也方便大家可以有更大的收获.但事实上是什么样子,我也就不多说了,我相信上网查过资料的亲都有过感受.在网上找了好久,最终还是有收获的.自己弄了几个小时后,终于折腾出来了.下面献上自己整理的源码,大神喷时还请手留情.先附一张效果图: css样式: .lazy{width:400px;h

如何用EFCore Lazy Loading实现Entity Split

α角 与 β角 支持 现实生活 的 计算机系统,总有着两大偏差,第一个是 现实生活 与 计算机系统 的α角,另外一个是计算机系统的 逻辑设计 与 物理设计 的β角.举个栗子: α角:假设某个公司的商业流程,我们在做计算机自动化的时候,会发生某种程度的改变.可能是用了新计算机系统,需要调整商业流程:也可能是某些商业流程,由于种种原因,没有被计算机系统实现支持... β角:这个比较常见,例如某个类本身是没有什么ID之类的属性,而由于我们选择了某个数据库产品来做持久化,而数据表的主键用了 某某ID 这

WPF 动态生成对象属性 (dynamic)

原文:WPF 动态生成对象属性 (dynamic) 项目中列行的数据 都需要动态生成 所以考虑到对象绑定  可需要一个动态生成属性的意思 缺点 加载速度会慢 很明显的慢 解决办法 尽量减轻动态属性的量~ 参考文章 https://www.cnblogs.com/maomiyouai/p/3594132.html https://www.cnblogs.com/dingli/archive/2012/06/14/2548687.html(这个没看明白 但是冥冥中让我觉得 收藏一下以后可能会用) 代

JavaScript原生对象属性和方法详解——Array对象 转载

length 设置或返回 数组中元素的数目. 注意:设置 length 属性可改变数组的大小.如果设置的值比其当前值小,数组将被截断,其尾部的元素将丢失.如果设置的值比它的当前值大,数组将增大,新的元素被添加到数组的尾部,它们的值为 undefined.所以length不一定代表数组的元素个数. var arr = new Array(3) arr[0] = "John" arr[1] = "Andy" arr[2] = "Wendy" cons

javascript 对象属性的添加,删除,json对象和字符串转换方法等

1:动态添加 对象属性 var obj = new Object(); console.log (obj.username); obj.username = "haha"; console.log (obj.username); //undefined //haha 用"[]"表示.写成 obj["username"] = "haha"; var obj = new Object(); console.log (obj.use

[Angular Router] Lazy loading Module with Auxiliary router

Found the way to handle Auxiliary router for lazy loading moudle and erge load module are different. In Erge loading, it is recommended to create a shell component, inside shell component you need to define the router-outlet for each Auxiliary routes

Node对象属性

1.Node对象属性一            * nodeName             * nodeType            * nodeValue * 使用dom解析html时候,需要html里面的标签,属性和文本都封装成对象 <body> <span id="spanid">哈哈呵呵</span> <script type="text/javascript"> //获取标签对象 var span1 = d

javascript中对象属性的介绍

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script type="text/javascript"> // 对象的属性是什么类型的? string // 如果对象的属性不是字符