.setResource("jbpm.cfg.xml")讲解
上次阅读,我们知道了下面这行代码中,Confiuration()这一部分是如何实现的.在第三部分阅读,我们来看看第二部分".setResource("jbpm.cfg.xml")".
singleton = new Configuration().setResource("jbpm.cfg.xml").buildProcessEngine();
上次阅读提到,Configuration类中的所有方法都是由其子类实现的.接下来,我们看看Configuration类中的下面这段代码和其子类ConfigurationIpml类是怎样实现的,具体做了些什么.
Configuration类
/** provide an classpath resource as the configuration file */
public Configuration setResource(String resource) {
impl.setResource(resource);
return impl;
}
ConfigurationImpl类
public ConfigurationImpl setResource(String resource) {
parse(new ResourceStreamInput(resource, getClassLoader()));
return this;
}
protected void parse(StreamInput streamSource) {
isConfigured = true; //是否配置过,解析完就等于是配置过了,所以这里是true.
ConfigurationParser.getInstance() //得到了一个解析器的实例.Parser的一个子类.
.createParse() //创建一个解析对象.
.contextStackPush(this) //在解析对象中压入ConfigurationImpl,因为ConfigurationImpl是一个配置类.
.setStreamSource(streamSource) //配置文件的来源.
.execute() //调用相应的解析器,执行.
.checkErrors("jbpm configuration " + streamSource); //
}
由上面的代码可以看出,最中调用的是子类ConfigurationImpl中的一parse方法.方法中有一个解析类ConfigurationParser.这个解析类非常重要,因为在JBPM中,这个解析类非常常见,JBPM在解析配置文件的时候基本都是这样一个代码模式.我们把它研究透了,对我们后面的阅读有很大的帮助,而且对于我们以后在项目中写解析配置文件的代码十分有帮助.
我们先了解一下几个概念:
- Parser - 解析器,它是负责解析的.我们在JBPM中看到上面的这一段代码时,需要找到具体的解析器子类,因为在execute()方法中, 调用的parseDocument()方法和 parseDocumentElement()方法,有可能被最终的子类覆盖.这点我们需要注意.
- Pase - 解析对象,记录解析过程中所需的资源,及解析过程中产生的一些付产品和最后的解析结果.
- 上下文
在不同的解析过程中,可能用的是一个或多个Parser解析器;但每一次解析过程中,必定创建唯一的一个Parse解析对象和上下文.
模板模式
这研究JBPM解析配置文件的过程中,我们再引入一种设计模式,模板模式.首先我们了解模板模式的定义:
- 定义一个操作中的算法的骨架,并将一些步骤延迟到子类中.
- TemplatMethod使德子类可以不改变一个算法的结构即重定义该算法的某些特定步骤.
适用性:
- 一次性实现一个算法的不变的部分,并将可变的部分留给子类实现.
- 各子类中公共的行为应被提取出来并集中到一个公共类中以避免代码重复.
- 首先识别现有代码中的不同之处,并且将不同之初分离为新的操作.
- 最后,用一个调用这些新的操作的模板方法来替换这些不同的代码.
3. 控制子类扩展.
设计模板:
- AbstractClass
- 定义抽象的原语操作(primitive operation),具体的子类将重定义他们以实现一个算法的各步骤.
- 实现一个模板方法,定义一个算法的骨架.
- 该模板方法不仅调用原语操作,也调用定义在AbstractClass或其他对象中的操作.
2. ConcreteClass
- 实现原语操作以完成算法中与特定子类相关的步骤.
例子:
Abstract类
public abstract class Template {
public abstract void print();
public void update() {
System.out.println("开始打印");
for (int i = 0; i < 10; i++) {
print();
}
}
}
Concete类
public class TemplateConcrete extends Template {
@*verride
public void print() {
System.out.println("这是子类的实现");
}
}
总结
这一次阅读,我们介绍了".setResource()"这一部分的实现.".setResource()"实现了解析JBPM配置文件的功能.需要注意的问题有以下几点:
- 解析配置文件代码中的三部分parser,parse和上下文.
- 解析上下文中的execute()方法中,需要注意parseDocument()方法和parseDocumentElement()方法,有可能被最终的子类覆盖.
- 解析器Parser是一个模板类,其中的子类有ConfigurationParser,这是JAVA中常用的模板设计模式.