本系列文章均整理自我在先前一家公司的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接口,如下:
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的強大功能,敬請期待。