本系列文章均整理自我在先前一家公司的CGLib使用总结和笔记。分享出来,希望对看到的人有所帮助,同时欢迎大家提出宝贵意见。如需转载,请勿修改,且注明作者shensy及出处。
--------------------------------------
实战CGLib系列文章
本篇介绍延迟加载器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方法,就会自动触发代理类回调)。
结束语:
以上就是CGLib延迟加载的一个示例,本系列下一篇将继续介绍CGLib的强大功能,敬请期待。
相关推荐
Maven坐标:cglib:cglib-nodep:3.1; 标签:cglib、nodep、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变...
Maven坐标:cglib:cglib:3.1; 标签:cglib、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明...
Spring系列第12篇:lazy-init:bean延迟初始化Spring系列第13篇:使用继承简化bean配置(abstract & parent)Spring系列第14篇:lookup-method和replaced-method比较陌生,怎么玩的?Spring系列第15篇:代理详解(Java...
在java编程使用CGLIB做动态代理时需要CGLIB依赖包支持,没有这个支持包,当导入import net.sf.cglib.proxy.Enhancer;或者import net.sf.cglib.proxy.MethodProxy;类似包时会提示错误,所以分享出来同大家共勉。
Maven坐标:cglib:cglib-nodep:3.2.4; 标签:cglib、nodep、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持...
Maven坐标:cglib:cglib-nodep:3.1; 标签:cglib、nodep、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持...
Cglib的jar文件,包含:asm.jar、asm-commons.jar、asm-tree.jar、cglib-2.2.jar 四个jar包
Maven坐标:cglib:cglib:3.3.0; 标签:cglib、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明...
package com.gc.cglib下为:aop方式cglib代理 package com.gc.dynproxy下为:aop方式动态代理 package com.gc.javaproxy下为:java代理机制实现 package com.gc.proxy下为:自定义代理模式(面向接口编程) ...
三、CGLIB的应用 广泛的被许多AOP的框架使用,例如Spring AOP和dynaop。Hibernate使用CGLIB来代理单端single-ended(多对一和一对一)关联。 四、CGLIB的API 1、Jar包: cglib-nodep-2.2.jar:使用nodep包不需要...
Maven坐标:cglib:cglib:3.3.0; 标签:cglib、jar包、java、中英对照文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和...
cglib-3.2.5.jar、cglib-nodep-3.2.5.jar、cglib-RELEASE_3_2_5.tar.gz(源码)、cglib-RELEASE_3_2_5.zip(源码)
CGLIB简介CGLIB简介CGLIB简介CGLIB简介CGLIB简介
cglib-3.2.5.jar的jar包 十分好用的一个动态代理包
Maven坐标:cglib:cglib-nodep:3.2.4; 标签:cglib、nodep、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...
spring framework入门(6):java中的动态代理(jdk和cglib) 博客地址:https://blog.csdn.net/u010476739/article/details/76737460
Spring 会使用 java.lang.reflect.Proxy 类来创建代理对象。 CGLIB 代理:用于代理没有实现接口的类或final类。CGLIB(Code Generation Library)是一个代码生成的类库,可以在运行时动态生成一个目标类的子类,并...
开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4...
spring AOP中的cglib代理所依赖的jar包cglib.jar源码 net.sf.cglib.proxy
cglib