org.activiti.engine包下有一个名为ProcessEngines的抽象类,我把它看做作流程引擎的容器,它持有所有注册在案流程引擎实例。
init和destory方法定义了它的生命周期。
init负责加载类路径下的名为activiti.cfg.xml或activiti-context.xml的资源文件,并用俩种不同的方式来初始化资源文件中所配置的流程引擎。
(1)普通(activiti.cfg.xml):initProcessEnginFromResource(resource)
注:这是个私有方法
调用关系:initProcessEnginFromResource---》
buildProcessEngine---》
ProcessEngineConfiguration.buildProcessEngine
真正干活(创建流程实例的)的是ProcessEngine类的buildProcessEngine
注:ProcessEngine类见后。
(2)借助spring:initProcessEngineFromSpringResource(resource)
注:这是个protected方法
protected static void initProcessEngineFromSpringResource(URL resource) { try { //加载SpringConfigurationHelper类到内存中 Class< ? > springConfigurationHelperClass = ReflectUtil.loadClass("org.activiti.spring.SpringConfigurationHelper"); // 通过反射得到buildProcessEngine方法 // 执行此方法,创建流程引擎实例 Method method = springConfigurationHelperClass.getMethod("buildProcessEngine", new Class<?>[]{URL.class}); method.invoke(null, new Object[]{resource}); } catch (Exception e) { throw new ActivitiException("couldn't initialize process engine from spring configuration resource "+resource.toString()+": "+e.getMessage(), e); } }
从源码中可以看出,这个流程引擎的容器,在一个生命周期内只会被初始化一次。
public synchronized static void init() { if (!isInitialized) { if(processEngines == null) { processEngines = new HashMap<String, ProcessEngine>(); ............ ............ ............ } } else { log.info("Process engines already initialized"); } }init方法执行的时机(即容器初始化)
在第一次需要得到流程引擎实例时,整个容器开始初始化
public static ProcessEngine getProcessEngine(String processEngineName) { if (!isInitialized) { init(); } return processEngines.get(processEngineName);
destroy,主要做关闭引擎实例,清理容器(对应的实例信息等),并对容器初始化标识(静态变量isInitialized)重置为false,至此一个流程引擎容器一个完整生命周期结束。
ProcessEngineConfiguration是一个抽象类,buildProcessEngine是它的一个模板方法 ,有待其不同的子类用不同的方式实现。
还有,它有很多不同的静态工厂方法,来代替构造器,以产生出不同的ProcessEngineConfiguration实例
干活人(创建流程引擎实的类):ProcessEngineConfigurationImpl
关于创建流程引擎实例:
public ProcessEngine buildProcessEngine() { init(); return new ProcessEngineImpl(this); }
这个方法就相当复杂了,也进入了正题。。。。