activiti学习笔记(四) 配置器

activiti配置器

activiti配置器的作用

       一般在构建流程实例的时候, 会进行初始化,配置器就是可以在获取了流程配置实例,以及初始化之后可以进行一些额外的配置

activiti配置器的机制

allConfigurators集合添加

       在ProcessEngineConfigurationImpl这个类中调用init方法中initConfigurators方法,将所有流程配置器添加到allConfigurators这个集合,流程配置器有两种获取形式,第一种是直接通过bean方式注入到configurators遍历添加到allConfigurators集合,第二种是通过调用spi模式,加载到allConfigurators集合。最后将所有的按照照priority的大小进行排序

public void initConfigurators() {


    //一个list集合,存放所有ProcessEngineConfigurator
    allConfigurators = new ArrayList<ProcessEngineConfigurator>();

    //遍历Configurators将其添加到allConfigurators这个集合
    if (configurators != null) {
      for (ProcessEngineConfigurator configurator : configurators) {
        allConfigurators.add(configurator);
      }
    }

    //获取当前类加载器
    if (enableConfiguratorServiceLoader) {
      ClassLoader classLoader = getClassLoader();
      if (classLoader == null) {
        classLoader = ReflectUtil.getClassLoader();
      }

      //利用spi模式加载ProcessEngineConfigurator所有实现类 将其添加到allConfigurators集合
      ServiceLoader<ProcessEngineConfigurator> configuratorServiceLoader = ServiceLoader.load(ProcessEngineConfigurator.class, classLoader);
      int nrOfServiceLoadedConfigurators = 0;
      for (ProcessEngineConfigurator configurator : configuratorServiceLoader) {
        allConfigurators.add(configurator);
        nrOfServiceLoadedConfigurators++;
      }

      if (nrOfServiceLoadedConfigurators > 0) {
        log.info("Found {} auto-discoverable Process Engine Configurator{}", nrOfServiceLoadedConfigurators++, nrOfServiceLoadedConfigurators > 1 ? "s" : "");
      }

      //将allConfigurators进行排序,按照priority1的从大到小
      if (!allConfigurators.isEmpty()) {
        Collections.sort(allConfigurators, new Comparator<ProcessEngineConfigurator>() {
          @Override
          public int compare(ProcessEngineConfigurator configurator1, ProcessEngineConfigurator configurator2) {
            int priority1 = configurator1.getPriority();
            int priority2 = configurator2.getPriority();

            if (priority1 < priority2) {
              return -1;
            } else if (priority1 > priority2) {
              return 1;
            }
            return 0;
          }
        });

        // Execute the configurators
        log.info("Found {} Process Engine Configurators in total:", allConfigurators.size());
        for (ProcessEngineConfigurator configurator : allConfigurators) {
          log.info("{} (priority:{})", configurator.getClass(), configurator.getPriority());
        }

      }

    }
  }

初始化调用方法

在ProcessEngineConfigurationImpl调用init方法中configuratorsBeforeInit方法,它会遍历所有的allConfigurators,并调用其中的beforeInit

  /**调用所有配置器的beforeInit方法*/
  public void configuratorsBeforeInit() {
    for (ProcessEngineConfigurator configurator : allConfigurators) {
      log.info("Executing beforeInit() of {} (priority:{})", configurator.getClass(), configurator.getPriority());
      configurator.beforeInit(this);
    }
  }

初始化后配置方法调用

在ProcessEngineConfigurationImpl调用init方法中configuratorsAfterInit方法,它会遍历所有的allConfigurators,并调用其中的configure

 /**调用所有配置的configure方法*/
  public void configuratorsAfterInit() {
    for (ProcessEngineConfigurator configurator : allConfigurators) {
      log.info("Executing configure() of {} (priority:{})", configurator.getClass(), configurator.getPriority());
      configurator.configure(this);
    }
  }

activiti配置器的接口类

public interface ProcessEngineConfigurator {

  /**init方法的第二个方法调用,第一个是获取所有ProcessEngineConfigurator(当前接口的实例) 在初始化前做一些操作*/
  void beforeInit(ProcessEngineConfigurationImpl processEngineConfiguration);

  /**init方法的最后一个调用,在初始化后可以做一些配置*/
  void configure(ProcessEngineConfigurationImpl processEngineConfiguration);

  /**使用实例时,首先按照priority进行裴谞,如果你有实例之间的依赖性,自己定义优先级序*/
  int getPriority();

}

activiti的bean方式配置文件

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans   
       http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
		<property name="driverClassName">
			<value>com.mysql.jdbc.Driver</value>
		</property>
		<property name="url">
			<value>jdbc:mysql://127.0.0.1:3306/activiti?useUnicode=true&characterEncoding=UTF-8
			</value>
		</property>
		<property name="username">
			<value>root</value>
		</property>
		<property name="password" value="fadp" />
	</bean>

	<bean id="processEngineConfigurator1" class="com.activiti_study.ch7.processEngineConfigurator1"></bean>
	<bean id="processEngineConfigurator2"  class="com.activiti_study.ch7.processEngineConfigurator2"></bean>

	<bean id="processEngineConfiguration"
		class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
		<property name="dataSource" ref="dataSource" />
		<property name="processEngineName" value="shareniu" />
		<property name="configurators">
		
		<list>
		  <ref bean="processEngineConfigurator1"/>
		  <ref bean="processEngineConfigurator2"/>
		</list>
		</property>
	</bean>
</beans>

activiti的实现类

public class processEngineConfigurator1 extends AbstractProcessEngineConfigurator{
	@Override
	public void beforeInit(
			ProcessEngineConfigurationImpl processEngineConfiguration) {
		System.out.println("1:beforeInit ");
		processEngineConfiguration.setDatabaseSchemaUpdate("true");
	}
	@Override
	public void configure(
			ProcessEngineConfigurationImpl processEngineConfiguration) {
		System.out.println("1:configure ");
		String databaseSchemaUpdate = processEngineConfiguration.getDatabaseSchemaUpdate();
		System.out.println(databaseSchemaUpdate+"-----------------");
	}
}
public class processEngineConfigurator2 extends AbstractProcessEngineConfigurator{
	@Override
	public void beforeInit(
			ProcessEngineConfigurationImpl processEngineConfiguration) {
		System.out.println("2:beforeInit ");
		processEngineConfiguration.setDatabaseSchemaUpdate("true");
	}
	@Override
	public void configure(
			ProcessEngineConfigurationImpl processEngineConfiguration) {
		System.out.println("2:configure ");
		String databaseSchemaUpdate = processEngineConfiguration.getDatabaseSchemaUpdate();
		System.out.println(databaseSchemaUpdate+"-----------------");
	}
}

activit配置器的测试代码

public class App {
	@Test
	public void getProcessEngine() {
		ProcessEngineConfiguration pec = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("com/activiti_study/ch7/activiti1.cfg.xml");
		ProcessEngine pe1 = pec.buildProcessEngine();
	}
}

activiti配置器的测试结果

1:beforeInit 
2:beforeInit 
1:configure 
true-----------------
2:configure 
true-----------------

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏黑泽君的专栏

【小知识】小例子说明Spring的核心思想之一:控制反转。

目的:改写已存在的类的某个方法或某些方法,使方法增强了。装饰设计模式(也即包装设计模式) 口诀:

1331
来自专栏py+selenium

[笨方法学python]习题51自动化测试笔记

本节自动化测试部分看不大懂,自己每步都打印出来,帮助理解。(代码标红部分为自己加入调试为打印变量值所用)

1682
来自专栏Jerry的SAP技术分享

Java异常处理:如何写出“正确”但被编译器认为有语法错误的程序

文章的标题看似自相矛盾,然而我在“正确”二字上打了引号。我们来看一个例子,关于Java异常处理(Exception Handling)的一些知识点。

1203
来自专栏java工会

Spring中的9种设计模式汇总

又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。

1032
来自专栏互联网杂技

前端异步代码解决方案实践(二)

早前有针对 Promise 的语法写过博文,不过仅限入门级别,浅尝辄止食而无味。后面一直想写 Promise 实现,碍于理解程度有限,多次下笔未能满意。一拖再拖...

1986
来自专栏爱撒谎的男孩

Spring表达式和自动装配

4238
来自专栏IT技术精选文摘

跟着实例学习ZooKeeper的用法: 队列

使用Curator也可以简化Ephemeral Node (临时节点)的操作。Curator也提供ZK Recipe的分布式队列实现。 利用ZK的 PERSIS...

2557
来自专栏大内老A

yield在WCF中的错误使用——99%的开发人员都有可能犯的错误[上篇]

在定义API的时候,对于一些返回集合对象的方法,很多人喜欢将返回类型定义成IEnumerable<T>,这本没有什么问题。这里要说的是另一个问题:对于返回类型为...

1798
来自专栏java工会

Spring中的9种设计模式汇总

又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。

991
来自专栏IMWeb前端团队

还在纠结用不用ES6,不如来试试TypeScript

The only limits in our life are those we impose on ourselves. 弱爆的 ES6 in bro...

2200

扫码关注云+社区