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

本系列文章均整理自我在先前一家公司的CGLib使用总结和笔记。分享出来,希望对看到的人有所帮助,同时欢迎大家提出宝贵意见大笑。如需转载,请勿修改,且注明作者shensy及出处。

--------------------------------------

实战CGLib系列文章

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

一、作用:

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

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

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

二、示例:

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

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接口,如下:

扫描二维码关注公众号,回复: 726306 查看本文章
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;
	}
}

验证延迟加载:

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

控制台输出:

DispatcherBean
abc
Dispatcher loadObject ...
PropertyBeanName!
Dispatcher loadObject ...
1

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

结束语:

以上就是CGLib中Dispatcher延迟加载的一个示例,本系列下一篇将继续介绍CGLib的强大功能,敬请期待。

猜你喜欢

转载自shensy.iteye.com/blog/1884572