文档章节

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

mn_1127
 mn_1127
发布于 2016/03/29 10:31
字数 452
阅读 24
收藏 1

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


本文转载自:http://shensy.iteye.com/blog/1884572

mn_1127
粉丝 6
博文 23
码字总数 6952
作品 0
杭州
后端工程师
私信 提问
深入理解Cglib动态代理及手动实现

CGLIB介绍与原理(部分节选自网络) 一、什么是CGLIB? CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代...

HOT_POT
2018/07/28
0
0
Java面试基础篇——第十五篇:代理模式

什么是代理? 通过代理控制对象的访问,可以详细访问某个对象的方法,在这个方法调用处理,或调用后处理。 代理应用场景 安全代理 可以屏蔽真实角色远程代理 远程调用代理类RMI延迟加载 先加载...

developlee的潇洒人生
2018/08/02
0
0
使用CGLIB包创建动态代理(2)(转)

当net.sf.cglib.proxy.MethodInterceptor做为所有代理方法的回调(callback)时,当对基于代理的方法调用时,在调用原对象的方法的之前会调用这个方法,如图3所示。第一个参数是代理对像,第...

Carl_
2015/01/07
0
0
Spring Proxy 动态代理(ProxyFactory)

一、动态代理生成技术栈分为两种: 1、JDK动态代理 JDK动态代理只能对实现了接口的类生成代理,而不能针对类 2、Cglib动态代理 CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其...

王微_1986
2018/07/27
0
0
JDK动态代理与Cglib动态代理(转载)

spring容器通过动态代理再结合java反射思想可以使得方法调用更加简洁 一、动态代理概述: 与静态代理对照(关于静态代理的介绍 可以阅读上一篇:JAVA设计模式之 代理模式【Proxy Pattern】(...

思悟修
2015/08/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

最开始学习素描的步骤是什么?

最开始学习素描的步骤是什么?很多学画画的朋友们都会问直接跳过素描不学素描行不行,小编非常的肯定告诉你不行,素描是所以绘画类的基础,台阶是一层一层筑起的,目前的现实是未来理想的基础...

设绘嗨
28分钟前
1
0
Caused by: java.lang.ClassCastException: scala.collection.mutable.WrappedArray

code val linkPairSum = F.udf( (list:List[Map[Long,Int]]) => { var map = Map[Long,Int]() for(m <- list){ if(m != null){ ......

张欢19933
29分钟前
1
0
git常见问题

一、clone代码 clone 1.登录账号密码不对 fatal: Authentication failed for 2.权限不足 Permission denied (publickey) 或者emote: User permission denied fatal: unable to access u......

hexiaoming123
38分钟前
1
0
Mybatis操作mysql 8的Json字段类型

Json字段是从mysql 5.7起加进来的全新的字段类型,现在我们看看在什么情况下使用该字段类型,以及用mybatis如何操作该字段类型 一般来说,在不知道字段的具体数量的时候,使用该字段是非常合...

算法之名
46分钟前
38
0
Windows7至Windows10的升级建议

目前,诸多企业或已开始在进行Windows7至Windows10的升级,或正在规划Windows7升级至Windows10。 主要原因有两个: Windows7的生命周期即将结束,这意味着再也无法获取Windows7的安全更新,以...

嘉为科技
49分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部