实战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的属性都会自动触发回调方法加载对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值