activiti的配置文件主体类是Configuration,它的源码分成几部分,首先是类属性:
//日志初始化
private static Logger log = Logger.getLogger(Configuration.class.getName());
//定义通用的常量,用于各项初始化
public static final String NAME_COMMANDEXECUTOR = "CommandExecutor";
public static final String NAME_DBSCHEMA = "DbSchema";
public static final String NAME_IBATISSQLSESSIONFACTORY = "IbatisSqlSessionFactory";
public static final String NAME_DBIDGENERATOR = "DbidGenerator";
public static final String NAME_DEPLOYERMANAGER = "DeployerManager";
public static final String NAME_PROCESSCACHE = "ProcessCache";
public static final String NAME_PERSISTENCETYPEISSQL = "PersistenceTypeIsSQL";
public static final String NAME_TRANSACTIONALOBJECTDESCRIPTORS = "TransactionalObjectDescriptors";
public static final String NAME_JOBEXECUTOR = "JobExecutor";
//实例属性
protected String name = null;//配置属性名
protected String type = null;//配置属性类型
protected Map<String, Object> configurations = new HashMap<String, Object>();//配置属性集合
然后是构造函数:
//默认构造函数,日志输出流程引擎版本
public Configuration() {
log.info("activiti version "+ProcessEngine.VERSION);
}
然后是功能初始化方法
//添加配置属性,以键值对的形式放入配置属性集合中
public Configuration configurationObject(String name, Object object) {
configurations.put(name, object);
return this;
}
//通过资源名生成配置文件
public Configuration configurationResource(String resourceName) {
ConfigurationParser.INSTANCE
.createParse()
.configuration(this)
.sourceResource(resourceName)
.execute();
return this;
}
//通过url生成配置文件
public Configuration configurationUrl(URL url) {
ConfigurationParser.INSTANCE
.createParse()
.configuration(this)
.sourceUrl(url)
.execute();
return this;
}
剩余的就是get/set方法和初始化流程引擎的方法了。
从上面我们可以看出,生成配置文件的方法就是Configuration 类的核心方法。这个生成过程也很有意思,当我们对源码进行追踪的时候,我们发现关联的有4个类:解析器父类Parser和解析器子类ConfigurationParser,解析处理父类Parse和解析处理子类ConfigurationParse。
单从名字来看,这个4个类两两对应;从功能来看,解析器类为解析处理类提供解析器,解析处理类负责具体配置文件的解析。
首先来看解析器父类Parser:
public class Parser {
//protected 的静态类属性,初始化XML解析器工厂
protected static SAXParserFactory defaultSaxParserFactory = SAXParserFactory.newInstance();
//提供自身的常量单例对象
public static final Parser INSTANCE = new Parser();
//以自身为参数提供新的解析处理类
public Parse createParse() {
return new Parse(this);
}
//从XML解析器工厂中获取XML解析器提供给子类
protected SAXParser getSaxParser() throws Exception {
return getSaxParserFactory().newSAXParser();
}
//为子类提供XML解析器工厂
protected SAXParserFactory getSaxParserFactory() {
return defaultSaxParserFactory;
}
}
由解析器父类Parser的源码我们可以看出,它的主要特征是自身单例,生成静态XML解析器工厂实例(SAXParserFactory),然后为解析处理父类Parse提供XML解析器(SAXParser )并生成新的解析处理父类Parse的实例。
那么,接下来我们就看看解析器父类Parse:
//解析处理父类Parse继承了SAX2的默认XML事件处理基类<