`

实战CGLib系列之proxy篇(四):改进版延迟加载Dispatcher

 
阅读更多

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

 

实战CGLib系列文章

本篇介绍改进版延迟加载器Dispatcher。

一、作用:

上一篇文章中,介绍了延迟加载器LazyLoader。本篇介绍另一种延迟加载接口Dispatcher。

Dispatcher接口同样继承于Callback,也是一种回调类型。

但是Dispatcher和LazyLoader的区别在于:LazyLoader只在第一次访问延迟加载属性时触发代理类回调方法,而Dispatcher在每次访问延迟加载属性时都会触发代理类回调方法。

二、示例:

与上篇文章相同,先定义一个实体类DispatcherBean,该Bean内有一个需要延迟加载的属性PropertyBean。PropertyBean的代码与上一篇相同,这里只看一下DispatcherBean:

Java代码 复制代码 收藏代码
  1. public class DispatcherBean {   
  2.     private String name;   
  3.     private String value;   
  4.     private PropertyBean propertyBean;   
  5.     public DispatcherBean(){   
  6.         this.name="DispatcherBean";   
  7.         this.value="abc";   
  8.         this.propertyBean=createDispatcherBean();   
  9.     }   
  10.     protected PropertyBean createDispatcherBean(){   
  11.         Enhancer enhancer=new Enhancer();   
  12.         enhancer.setSuperclass(PropertyBean.class);   
  13.         return (PropertyBean)enhancer.create(PropertyBean.class,new ConcreteClassDispatcher());   
  14.     }   
  15.         //setter/getter   
  16. }  
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接口,如下:

Java代码 复制代码 收藏代码
  1. public class ConcreteClassDispatcher implements Dispatcher{   
  2.     public Object loadObject() throws Exception {   
  3.         System.out.println("Dispatcher loadObject ...");   
  4.         PropertyBean object=new PropertyBean();   
  5.         object.setPropertyName("PropertyBeanName!");   
  6.         object.setPropertyValue(1);   
  7.         return object;   
  8.     }   
  9. }  
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;
	}
}

验证延迟加载:

Java代码 复制代码 收藏代码
  1. DispatcherBean dispatcherBean=new DispatcherBean();   
  2. System.out.println(dispatcherBean.getName());   
  3. System.out.println(dispatcherBean.getValue());   
  4.   
  5. PropertyBean pb=dispatcherBean.getPropertyBean();   
  6. System.out.println(pb.getPropertyName());   
  7. //在每次访问时都要进行回调   
  8. System.out.println(pb.getPropertyValue());  
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());

控制台输出:

Java代码 复制代码 收藏代码
  1. DispatcherBean   
  2. abc   
  3. Dispatcher loadObject ...   
  4. PropertyBeanName!   
  5. Dispatcher loadObject ...   
  6. 1  
DispatcherBean
abc
Dispatcher loadObject ...
PropertyBeanName!
Dispatcher loadObject ...
1

由此可见,每次获取property bean的属性都会自动触发回调方法加载对象。

分享到:
评论

相关推荐

    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”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明...

    Cglib3.3.0最新版jar包

    Cglib就是一种实现动态代理的方式,不同于JDK自带的Proxy,Cglib不需要目标对象实现任何接口,因此可以用于不能实现接口的对象。通过Enhancer类,我们可以指定需要代理的目标类,并提供回调方法实现动态代理逻辑。 ...

    hibernate延迟加载解决

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

    cglib的动态代理需要的包

    CGlib(Code Generation Library)是Java编程语言中的一个开源项目,主要用于代码的动态生成。它在许多场景下被广泛使用,特别是在实现Java的动态代理机制时。动态代理是一种技术,允许我们在运行时创建一个对象的...

    cglib及其依赖包

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

    Spring cglib 中文说明

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

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

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

    cglib实现动态代理依赖jar包

    CGLib,全称为Code Generation Library,是一个强大的高性能的代码生成库,它在Java世界中被广泛应用,尤其是在动态代理、AOP(面向切面编程)等领域。这个“cglib实现动态代理依赖jar包”包含了两个核心的JAR文件:...

    CGLib3.2.5依赖包及源码

    前者是CGLib的核心库,后者是独立版,不依赖于ASM库,适用于那些不希望引入额外依赖的项目。ASM是一个底层的Java字节码操作和分析框架,用于动态生成类和接口的实例。 源码包提供了CGLib的实现细节,包括`cglib-...

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

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

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

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

    Hibernate延迟加载

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

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

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

    cglib3.1-3.3.0.rar

    5. **asm**:CGlib底层依赖ASM库来操作字节码,ASM是一个轻量级的Java字节码操控和分析框架,可以直接生成和加载Java类。 关于版本差异,CGlib 3.3.0相对于3.1可能会有以下改进: - **性能优化**:新版本可能对...

    Cglib所需的jar包

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

    cglib.jar下载

    CGLIB介绍与原理(部分节选自网络) ...四、CGLIB的API 1、Jar包: cglib-nodep-2.2.jar:使用nodep包不需要关联asm的jar包,jar包内部包含asm的类. cglib-2.2.jar:使用此jar包需要关联asm的jar包,否则运行时报错.

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

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

Global site tag (gtag.js) - Google Analytics