jbpm源码阅读之二

  new Configuration()讲解

 

    接着上次,我们主要来研究下面这一句代码.看似简单,实例化了一个流程引擎,但他里面实现的逻辑是十分复杂的.这里值得我们学习,也是JBPM良苦用心的设计.我们以后设计的组件,也应该这样子,对外暴露的接口是十分简单的接口跟内部实现存在映射关系,但内部的实现是十分复杂的.让用户看起来模型是很简单的.

 

 

    我们把上面这一行简单的代码分为三部分讲解, 这次阅读我们具体来研究Configuration().

 

singleton = new Configuration().setResource("jbpm.cfg.xml").buildProcessEngine();
 

    Configuration() - 这是一个构造方法.具体的实现代码可以看下面代码.

 

    Configuration类

/** default constructor */
  public Configuration() {
	  /*
	   * 实例化Configuration的子类,ConfigurationImpl构造方法又调用Configuration的.
	   */
    impl = instantiate("org.jbpm.pvm.internal.cfg.ConfigurationImpl");
  }

  //在JAVA中,实例化子类时,需要调用其父类的构造函数.所以此构造函数是用来避免构造函数死循环.
  // constructor for ConfigurationImpl to prevent construction loop
  protected Configuration(Object o) {
  }

  protected Configuration instantiate(String className) {
    Configuration implementation;
    try {
      Class<?> implementationClass = null;
      try {
        implementationClass = Class.forName(className, true, getClassLoader());
      } catch(ClassNotFoundException ex) {
        implementationClass = Class.forName(className);
      }
      implementation = (Configuration) implementationClass.newInstance();
    } catch (Exception e) {
      throw new JbpmException("couldn't instantiate configuration of type "+className, e);
    }
    return implementation;
  }

    从默认的构造方法我们能简单地看出,实例化了一个类,这个类是"org.jbpm.pvm.internal.cfg.ConfigurationImpl".ConfigurationImpl是Configuration的一个子类,也就是说在Configuration类中实例化了它的子类.

 

    问题一:为什么要这样做呢?在自己的构造方法中直接实例化便行了,为什么要实例化一个子类?

    我们可以去看JBPM4.0的源码就能得出答案.Configuration类有多个实现,有默认版本的,带Spring版本的,甚至其他版本的.到底是要初始化哪一个版本的呢?它的行为模式到底是有Spring还是没有Spring呢?这是通过它的构造方法区分开的.

 

    具体我们可以这样做,往构造方法传进去它的核心,也就是说我们传进去的核心是什么,它的外皮就会呈现出相应的功能.可以用一个比喻,披着狼皮的羊.

    小结一下,在Configuration类中,实例化了它的一个子类,Configuration的所有行为方式,都是由它的子类实现的.

 

    问题二:JAVA中,在父类中实例化一个子类,在子类的构造方法中,需要调用父类的构造方法.那在这个过程中,是不是会造成一个循环呢?

    我们来看一下JBPM的作者是怎么处理的,我们分别查看一下父类和子类的构造方法便得到答案.子类的构造方法代码如下.

 

    ConfigurationImpl类:

 

public ConfigurationImpl() {
    // to prevent a loop in the constructors, we need to delegate to a non-default constructor in Configuration
    super(null);
  }

    父类中,有一个构造方法Configuration(Object o).子类super(null)方法中调用的是Configuration(Object o)这个构造方法.这个Configuration(Object o)方法即可解决掉这个死循环.这很值得我们学习.

    我们来假设一下,如果子类构造方法中没有super(null)这行代码.

 

  1. 首先Configuration类的构造方法实例化了它的子类ConfigurationImpl.
  2. 由于JAVA VM的需要,在子类 ConfigurationImpl的构造方法中,默认会调用父类的构造方法 Configuration().
  3. Configuration()实例化子类 ConfigurationImpl.

    很明显,这样就是一个死循环.

 

 

 

    总结

        总节这一次阅读,这次阅读内容就是new Configuration().setResource("jbpm.cfg.xml").buildProcessEngine();中的第一部分Configuration().具体我们知道了两个问题:

  • Configuration类是一个皮,具体是狼是羊是由它的子类也是它的实现类ConfigurationImpl决定的.
  • Configuration类的所有方法都是调用它的实现类 ConfigurationImpl,再一次说明 Configuration类是一张皮.
  • 在JBPM这种设计思想中,怎么样去解决死循环问题.

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值