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

实战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. }  

同样对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. }  

验证延迟加载:

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

控制台输出:

Java代码  

  1. DispatcherBean  

  2. abc  

  3. Dispatcher loadObject ...  

  4. PropertyBeanName!  

  5. Dispatcher loadObject ...  

  6. 1  

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


你可能感兴趣的:(实战CGLib系列之proxy篇(四):改进版延迟加载Dispatcher)