对象工厂可以依照bean的xml配置文件创建对象,配置文件指定了对象将被怎样创建、配置以及组装到一起形成一个完整的对象图。对象工厂可以注入配置和其他bean到一个bean中。
在最简单的形式中,对象工厂可以从这样一个配置中创建基本类型和java bean:
class=\ --------------------------------------------------------- ObjectFactory of = ObjectFactory.parseXmlFromAbove(); assertEquals(TaskInstance.class, of.getNewObject(\ assertEquals(\ assertEquals(new Integer(42), of.getNewObject(\ assertEquals(Boolean.TRUE, of.getNewObject(\ assertEquals(new Float(10.2), of.getNewObject(\ assertEquals(new Double(100000000.32), of.getNewObject(\ assertEquals(new Character('j'), of.getNewObject(\ assertNull(of.getNewObject(\ 你也可以配置列表: 以及map: Bean可以使用直接成员注入和通过属性的setter。 class=\ name=\ Bean可以被引用,被引用的对象不必必须是一个bean,也可以是一个字符串、整型或其他任何对象。 Bean可以使用任何构造器构造(构造函数)。 class=\ …或者在bean上使用工厂方法… class=\ singleton=\ class=\ …或者在类上使用一个静态工厂方法… class=\ factory-class=\method=\ 每个命名的对象都可以使用属性singleton=“true”标记为单态,这意味着给定的对象工厂为每个请求将总是返回相同的对象。注意,单态不能在不同对象工厂之间共享。 单态特性导致getObject和getNewObject方法间的区别,对象工厂的典型用户将使用getNewObject,这意味着在一个新的对象图被构造之前对象对象工厂首先要清除对象缓存。在构造对象图期间,非单态对象被存储在对象工厂的对象缓存中,允许共享引用一个对象。单态对象缓存不同于普通对象缓存,单态对象缓存不需要清除,而普通对象缓存在每个getNewObject方法被调用起始会被清除。 第7章 持久化 在很多情况下,Jbpm需要维护跨越长时间的流程的执行,在这里,“长时间”意味着跨越几个处理事务。因为流程执行就像是状态机,在一个处理事务中,我们就是把流程执行状态机从一个状态转到下一个状态,所以持久化的主要目的就是在等待状态存储流程的执行。 一个流程定义可以表现为三种不同形式:XML、Java对象、Jbpm数据库中记录。执行(运行时)信息和日志信息可以表现为两种形式:Java对象和Jbpm数据库中的记录。 图 7.1 转换和不同形式 有关XML表示流程定义以及流程档案的更多信息,请参考“第16章Jbpm流程定义语言(JPDL)”。 关于怎样部署流程档案到数据库在“第16.1.1节部署流程档案” 中可以找到。 7.1 持久化API 7.1.1 相关配置框架 持久化API集成在了配置框架中,通过JbpmContext暴露出了一些便利方法,因此持久化API要像下面这样在JbpmContext块中使用: JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { // Invoke persistence operations here } finally { jbpmContext.close(); } 在下文中,我们假设配置中包含如下持久化服务(如示例配置文件src/config.files/jbpm.cfg.xml): factory='org.jbpm.persistence.db.DbPersistenceServiceFactory' /> ... ... 7.1.2 JbpmContext中的便利方法 三个普通的持久化操作是: l 部署流程 l 启动一个流程的执行 l 继续一个执行 首先部署一个流程定义。典型的,这可以从图形化流程设计器或部署流程的Ant任务直接完成,但是在这里你会看到怎样通过编程实现: JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { ProcessDefinition processDefinition = ...; jbpmContext.deployProcessDefinition(processDefinition); } finally { jbpmContext.close(); } 要创建一个新的流程执行,我们需要指定一个要实例化执行的流程定义,通常的作法是指定一个流程名称,并让Jbpm在数据库中查找这个流程的最新版本: JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { String processName = ...; ProcessInstance processInstance = jbpmContext.newProcessInstance(processName); } finally { jbpmContext.close(); } 要继续一个流程执行,我们需要从数据库中取出这个流程实例、令牌或者任务实例,在这些POJO Jbpm对象上调用一些方法,然后再把对流程实例的更新保存到数据库中。 JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { long processInstanceId = ...; ProcessInstance processInstance = jbpmContext.loadProcessInstance(processInstanceId); processInstance.signal(); jbpmContext.save(processInstance); } finally { jbpmContext.close(); } 注意:如果你在JbpmContext中使用xxxForUpdate方法,则jbpmContext.save不需要再显式的调用,因为在jbpmContext关闭时它会被自动调用。举例来说,假设我们要通知Jbpm一个任务实例已经完成,(注意:任务实例完成能够触发继续执行,所以相联的流程实例必须保存。)一个非常方便的方法是使用loadTaskInstanceForUpdate方法: JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { long taskInstanceId = ...; one