`

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

 
阅读更多

作者shensy及出处http://shensy.iteye.com/blog/1881277

实战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. }  
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:

Java代码 复制代码 收藏代码
  1. public class PropertyBean {   
  2.     private String propertyName;   
  3.     private int propertyValue;   
  4.        
  5.     //setter/getter   
  6. }  
public class PropertyBean {
	private String propertyName;
	private int propertyValue;
	
	//setter/getter
}

在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. }  
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;
	}
}

验证延迟加载:

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());  
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());

 控制台输出:

控制台代码 复制代码 收藏代码
  1. loaderNameA   
  2. 123  
  3. LazyLoader loadObject() ...   
  4. lazy-load object propertyName!   
  5. 11  
  6. after...   
  7. lazy-load object propertyName!  
loaderNameA
123
LazyLoader loadObject() ...
lazy-load object propertyName!
11
after...
lazy-load object propertyName!

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

可见,延迟加载原理:

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

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

 

分享到:
评论

相关推荐

    cglib-nodep-3.1-API文档-中文版.zip

    Maven坐标:cglib:cglib-nodep:3.1; 标签:cglib、nodep、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变...

    cglib-3.1-API文档-中文版.zip

    Maven坐标:cglib:cglib:3.1; 标签:cglib、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明...

    cglib的动态代理需要的包

    在Java中,有两种常见的动态代理方式:Java内置的Java.lang.reflect.Proxy类和第三方库如CGlib。Java内置的Proxy类需要目标类实现至少一个接口,然后才能创建代理对象。然而,如果目标类没有实现任何接口,我们就不...

    hibernate延迟加载解决

    ### Hibernate延迟加载详解 #### 一、什么是延迟加载?...总之,Hibernate的延迟加载机制是提高应用性能的重要手段之一。通过合理配置和使用这一机制,可以有效地优化应用程序的数据加载流程,提高用户体验。

    Cglib3.3.0最新版jar包

    1. **Cglib**:Cglib是一个第三方库,全称为Code Generation Library。它允许开发者在运行时动态地创建子类或者增强已有对象的功能。Cglib基于ASM库,能够在字节码层面操作Java类,通过生成子类来实现对目标类的扩展...

    Spring cglib 中文说明

    ### Spring Cglib 中文说明 #### CGLIB 包简介与原理 CGLIB(Code Generation Library)是一个强大且高性能的代码生成库。它在众多面向切面编程(AOP)框架中扮演着核心角色,例如Spring AOP、Dynaop等。此外,它...

    cglib及其依赖包

    CGLib,全称为Code Generation Library,是一个强大的高性能的代码生成库,它在Java世界中被广泛应用,尤其是在动态代理和AOP(面向切面编程)领域。这个库的主要功能是能够在运行时动态创建类或者增强已有类的功能...

    JAVA spring 系列案例50个和学习资料

    Spring系列第12篇:lazy-init:bean延迟初始化Spring系列第13篇:使用继承简化bean配置(abstract & parent)Spring系列第14篇:lookup-method和replaced-method比较陌生,怎么玩的?Spring系列第15篇:代理详解(Java...

    cglib实现动态代理依赖jar包

    同时,由于CGLib不需要目标类实现接口,因此对于那些无法修改源代码的第三方库,它提供了一种灵活的代理方式。 总结来说,"cglib实现动态代理依赖jar包"中的asm-5.1.jar和cglib-3.2.4.jar是实现Java动态代理的重要...

    CGLib3.2.5依赖包及源码

    CGLib,全称为Code Generation Library,是一个强大的Java字节码操作库,广泛应用于动态代理、AOP(面向切面编程)以及性能优化等领域。它允许开发者在运行时创建和增强新的类或对象,而无需编写任何Java源代码。...

    cglib-nodep-3.2.4-API文档-中文版.zip

    Maven坐标:cglib:cglib-nodep:3.2.4; 标签:cglib、nodep、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持...

    Hibernate延迟加载

    延迟加载的实现依赖于CGLIB库,它会动态生成代理对象,使得在访问懒加载属性时能够无缝地触发数据库查询。 延迟加载可以通过以下几种方式配置: 1. 类级延迟加载:在映射文件中,`lazy="true"`或`lazy="false"`...

    Cglib所需的jar包

    Cglib是一个强大的Java代码生成库,主要用于动态创建子类,是Java编程中不可或缺的工具之一,尤其在AOP(面向切面编程)和ORM(对象关系映射)框架中广泛应用。Cglib是由Eclipse的AspectJ项目开发团队维护的,它能够...

    完整jar包资源,COULD NOT FIND cglib,包缺失使用

    当你看到"COULD NOT FIND cglib:cglib-2.2.2"这样的错误信息时,这意味着你的Maven或Gradle构建系统在尝试构建项目时无法找到这个特定版本的cglib依赖。这通常是由于以下原因造成的: 1. **本地Maven仓库中缺失该...

    cglib.jar下载

    三、CGLIB的应用 广泛的被许多AOP的框架使用,例如Spring AOP和dynaop。Hibernate使用CGLIB来代理单端single-ended(多对一和一对一)关联。 四、CGLIB的API 1、Jar包: cglib-nodep-2.2.jar:使用nodep包不需要...

    Cglib所需要的jar包

    在Java中,动态代理主要有两种方式:一是通过Java的反射API实现,二是通过第三方库如Cglib。本篇将深入探讨Cglib动态代理所需的jar包,以及它们在实际开发中的应用。 Cglib的核心jar包是`cglib-2.2.2.jar`,这是...

    Hibernate lazy延迟加载

    在Java的持久化框架Hibernate中,懒加载(Lazy Loading)是一种重要的优化策略,它的核心思想是“延迟加载”或“按需加载”。默认情况下,当一个实体被加载时,并不会立即加载其关联的对象或集合,而是在真正需要...

    cglib-nodep-3.1-API文档-中英对照版.zip

    Maven坐标:cglib:cglib-nodep:3.1; 标签:cglib、nodep、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持...

Global site tag (gtag.js) - Google Analytics