文档章节

实战CGLib系列之proxy篇(三):延迟加载LazyLoader

mn_1127
 mn_1127
发布于 2016/03/29 10:30
字数 578
阅读 47
收藏 1

实战CGLib系列文章
本篇介绍延迟加载器LazyLoader。
一、作用:
说到延迟加载,应该经常接触到,尤其是使用Hibernate的时候,本篇将通过一个实例分析延迟加载的实现方式。
LazyLoader接口继承了Callback,因此也算是CGLib中的一种Callback类型。

二、示例:
首先定义一个实体类LoaderBean,该Bean内有一个需要延迟加载的属性PropertyBean。

LoaderBean.java:

Java代码  

  1. public class LoaderBean {  

  2.     private String loaderName;  

  3.     private int loaderValue;  

  4.     private PropertyBean propertyBean;  

  5.     public LoaderBean(){  

  6.         this.loaderName="loaderNameA";  

  7.         this.loaderValue=123;  

  8.         this.propertyBean=createPropertyBean();  

  9.     }  

  10.     protected PropertyBean createPropertyBean(){  

  11.         Enhancer enhancer=new Enhancer();  

  12.         enhancer.setSuperclass(PropertyBean.class);  

  13.         return (PropertyBean)enhancer.create(PropertyBean.class,new ConcreteClassLazyLoader());  

  14.     }  

  15.       

  16.     //setter/getter...  

  17. }  

PropertyBean.java:

Java代码  

  1. public class PropertyBean {  

  2.     private String propertyName;  

  3.     private int propertyValue;  

  4.       

  5.     //setter/getter  

  6. }  

在LoaderBean的构造方法中,对属性Bean进行了代理类生成,使用了CGLib中的LazyLoader回调接口。

Java代码  

  1. public class ConcreteClassLazyLoader implements LazyLoader{  

  2.     public Object loadObject() throws Exception {  

  3.         System.out.println("LazyLoader loadObject() ...");  

  4.         PropertyBean bean=new PropertyBean();  

  5.         bean.setPropertyName("lazy-load object propertyName!");  

  6.         bean.setPropertyValue(11);  

  7.         return bean;  

  8.     }  

  9. }  

验证延迟加载:

Java代码  

  1. LoaderBean loader=new LoaderBean();  

  2. System.out.println(loader.getLoaderName());  

  3. System.out.println(loader.getLoaderValue());  

  4. PropertyBean propertyBean=loader.getPropertyBean();//访问延迟加载对象  

  5. System.out.println(propertyBean.getPropertyName());  

  6. System.out.println(propertyBean.getPropertyValue());  

  7. System.out.println("after...");  

  8. //当再次访问延迟加载对象时,就不会再执行回调了  

  9. System.out.println(propertyBean.getPropertyName());  

 控制台输出:

控制台代码  

  1. loaderNameA  

  2. 123  

  3. LazyLoader loadObject() ...  

  4. lazy-load object propertyName!  

  5. 11  

  6. after...  

  7. lazy-load object propertyName!  

注意,第一次获取property bean的属性时,会触发代理类回调方法。第二次再获取property bean的属性时,就直接返回属性值而不会再次触发代理类回调方法了。

可见,延迟加载原理:

对需要延迟加载的对象添加代理,在获取该对象属性时先通过代理类回调方法进行对象初始化。

在不需要加载该对象时,只要不去获取该对象内属性,该对象就不会被初始化了(在CGLib的实现中只要去访问该对象内属性的getter方法,就会自动触发代理类回调)。


本文转载自:http://shensy.iteye.com/blog/1881277

mn_1127
粉丝 6
博文 23
码字总数 6952
作品 0
杭州
后端工程师
私信 提问
深入理解Cglib动态代理及手动实现

CGLIB介绍与原理(部分节选自网络) 一、什么是CGLIB? CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代...

HOT_POT
2018/07/28
0
0
使用CGLIB包创建动态代理(2)(转)

当net.sf.cglib.proxy.MethodInterceptor做为所有代理方法的回调(callback)时,当对基于代理的方法调用时,在调用原对象的方法的之前会调用这个方法,如图3所示。第一个参数是代理对像,第...

Carl_
2015/01/07
0
0
MyBatis源码解读之延迟加载

目的 本文主要解读MyBatis 延迟加载实现原理 2. 延迟加载如何使用 Setting 参数配置 设置参数 描述 有效值 默认值 lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延迟加...

无忌
2018/07/16
0
8
Java面试基础篇——第十五篇:代理模式

什么是代理? 通过代理控制对象的访问,可以详细访问某个对象的方法,在这个方法调用处理,或调用后处理。 代理应用场景 安全代理 可以屏蔽真实角色远程代理 远程调用代理类RMI延迟加载 先加载...

developlee的潇洒人生
2018/08/02
0
0
JDK动态代理与Cglib动态代理(转载)

spring容器通过动态代理再结合java反射思想可以使得方法调用更加简洁 一、动态代理概述: 与静态代理对照(关于静态代理的介绍 可以阅读上一篇:JAVA设计模式之 代理模式【Proxy Pattern】(...

思悟修
2015/08/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

kotlin中奖概率

fun main() { var wins = 0 var chance = 0.2 var playTime = 10// 1000万次 val n = 10000000 (1..n).forEach { if (play(chance, playTime)) win......

oschina4cyy
24分钟前
1
0
第十一讲:爬取猫眼网站上的前100名电影

本次我们来通过翻页爬取的方式爬取猫眼电影里面推荐的前100名电影,并存储到数据库。 1、我们登录猫眼,看下我们的数据在哪里 然后点击今日TOP100,看下具体的网页数据 最下面我们看到底部有...

刘日辉
24分钟前
17
0
git 设置全局用户名/邮箱和某个项目用户名/邮箱/密码

一、特定项目设置用户名/邮箱/密码的方法 找到项目所在目录下的 .git,进入.git文件夹,然后执行如下命令分别设置用户名和邮箱 git config user.name "dawn.he" git config user.email "1...

hexiaoming123
24分钟前
0
0
好程序员分享Linux重器vi编辑器

创建练习文件 [root@tianyun ~]# ll -a > list.txt 文件编辑器 gedit 文件编辑器 vi, vim, nano vi编辑器工作模式 命令模式: a. 光标定位 hjkl 0 $ gg G 3G 进入第三行 /string (n N 可以循...

好程序员IT
26分钟前
2
0
Git整理(五) git cherry-pick的使用

概述 git cherry-pick可以理解为”挑拣”提交,它会获取某一个分支的单笔提交,并作为一个新的提交引入到你当前分支上。 当我们需要在本地合入其他分支的提交时,如果我们不想对整个分支进行...

嘿嘿嘿IT
33分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部