天天看點

實戰CGLib系列之proxy篇(四):改進版延遲加載Dispatcher

本系列文章均整理自我在先前一家公司的CGLib使用總結和筆記。分享出來,希望對看到的人有所幫助,同時歡迎大家提出寶貴意見

實戰CGLib系列之proxy篇(四):改進版延遲加載Dispatcher

。如需轉載,請勿修改,且注明作者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接口,如下:

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的強大功能,敬請期待。