jBPM(十四): 见证一ObjectInfo实例的诞生

    在jBPM(十三): 从ObjectFactory到ObjectInfo 的分析中, 我们看到ObjectInfo是jBPM解析配置文件过程中一个很核心的概念, 本篇和接下来的几篇中,我们将重点来看这个重要概念及它在设计模式方面带来的启发.
    
    本篇中集中看ObjectInfo(实现类)的创建. 不过,作为过渡,还是很有必要先看下ObjectInfo的家谱.

    ObjectInfo是一个接口,它本身继承自Serializable. 它的实现类及实现类的嫡系如下图所示:
    
    对这个图,这里我们稍微多说两句,就当是作为铺垫照应随后要介绍的jBPM配置文件. 我们看到,具体子类有JbpmContextInfo,StringInfo, ListInfo, MapInfo... JbpmContext类在前面已有所接触,它是我们调用jBPM API时很重要的一个概念,这里我们只表明下,它是继承自Object类的, 另外几个XXXInfo类的主体(如StringInfo类的主体是String),我们都很熟悉,也是最为常用的类, 当然它们也都继承自Object类. 说JbpmContext和String等都继承自Object类是废话,Java中的类没有一个不是继承自Object类,不过,我这里拙嘴笨舌地绕一 圈就是想说: 实现类里从内容和名字上都体现了ObjectInfo这个概念表达的主旨.


     我们再回过头来看ObjectInfo接口定义的方法: hasName, getName,isSingleton,createObject. 无疑最后的createObject方法是最为重要的一个, 看名字"create Object", 这是不是对应着ObjectFactory中定义的createObject(String name)方法呢? 答案是肯定的, 随着梳理的进展,这个答案会越来越清晰地呈现在我们面前. 说到这里,相信大家也多多少少觉察出这里边体现出的设计模式,对,工厂模式, 应该说这个工厂模式是我见过的最为标准的一个,也堪称教科书般的示例.






    上面对ObjectInfo的家谱做了一个简短的介绍,接下来我们来看一个ObjectInfo是怎么创建出来的. 由于ObjectInfo有很多子类, 这里只看一个,JbpmContextInfo类. 看下图:
    
    结合jBPM的源码,我们可以看出, 在new一个JbpmConfiguration实例时, 先在new出一个ObjectFactory实例来, 而在生成一个ObjectFactory实例时,又有多个ObjectInfo生成, 这里ObjectInfo产生的大背景.

    接下来,我们再从微观层面上来看ObjectInfo产生的瞬间. 依据左图的方法调用栈,我们看ObjectFactoryParser类中parseElements方法. 结合大背景及这个方法中用到的API, 我们不难看出, 这个方法把jBPM配置文件中的每一个Element(也就配置文件中每一个标签)通过parse方法转化为一个ObjectInfo实例,进而再把每一 个新生成的ObjectInfo实例放到objectFactory中. 这样ObjectInfo实例的产生就只能到parse方法里才能看到了.

    在parse方法中, 先得到elementTagName(以element.getTagName()方式),再据此elementTagName到mappings中取出 对应类的Constructor实例. 以现在所说的JbpmContextInfo类为例, elementTagName是"jbpm-context", 对应的Constructor实例是org.jbpm.configuration.JbpmContextInfo声明的满足某些特性的构造方法.  再接下来就是见证神奇的时刻, 也是我们要看的结果: constructor.newInstance生成了一个ObjectInfo实例!

    这篇写完了, 再加过头来总结下吧:  ObjectInfo家谱,  ObjectInfo实现子类及与ObjectFactory相应方法的暗合, 工厂模式, 宏观微观来看一个ObjectInfo(以JbpmContextInfo为例)的诞生.

    现在可以更有信心地说: 下一篇更加精彩, 敬请关注.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值