第 11 章 環境
11.1. 簡介
環境組件由連接環境組合是一種控制反轉(IoC)容器。 它讀取配置信息, 描述對象應該如何實例化 ,如何配置,如何連接在一起。
環境被用來獲得Activity實現 和流程虛擬機所需的資源和服務。 主要目的是讓流程虛擬機的多個部 分可配置, 這樣PVM和運行在頂部的語言可以工作在一個標准Java環境 也可以在一個企業Java環境。
環境被分成一系列環境。 每個環境可以擁有自己的生命周期。比如,流程引擎環境會 覆蓋應用的全 生命時間。塊環境只對try-finally塊周期內起作用。 一般一個塊環境負責一個數據庫事務。 每個環境 暴露一個key-value列表。 pairs.
11.2. EnvironmentFactory
為了開始和一個環境進行工作,你需要一個EnvironmentFactory. 一個單獨的環境工廠對象可以被用 在整個應用的完整生命時間裡。 所以一般這會保存在一個靜態成員變量中。 EnvironmentFactory自己在 流程引擎環境中
一個EnvironmentFactory一般被獲得 通過解析一個配置文件,像這樣:
static EnvironmentFactory environmentFactory =
EnvironmentFactory.parse(new ResourceStreamSource("pvm.cfg.xml");
參考javadocs包org.jbpm.stream,獲得流源的更多類型。
這是一個環境工廠中的默認解析器, 會創建DefaultEnvironmentFactory. 這個主意是我們也會支持 spring作為Ioc容器,但是這還處於TODO狀態。 很歡迎大家在這方面幫助我們:-)。這個解析器可以使 用靜態setter方法配置 EnvironmentFactory.setParser(Parser)。
11.3. 環境塊
一個環境為try-finally塊的范圍而存在。 這是一個環境塊看起來像怎樣:
Environment environment = environmentFactory.openEnvironment();
try {
...
} finally {
environment.close();
}
環境塊定義了另一個生命部分:block環境。 一個事務可以一個定義在塊環境中的對象的 常用例子。
在這樣一個塊中,對象可以通過名稱或類型在環境中查找到。 如果對象可以從環境中通過 environment.get(String name) 或<T> T environment.get(Class<T>) 找到。
當一個環境被創建時,它擁有一個process-engine環境 和一個block 環境。
在默認實現中,process-engine環境和 block環境是WireContext. 一個WireContext包含對象如何創 建和 如果綁定到正式的對象圖中。
11.4. 實例
為了啟動簡單實例,我們會需要一個Book:
public class Book {
...
public Book() {}
...
}
然後讓我們創建一個環境工廠,知道如何創建book
static EnvironmentFactory environmentFactory = EnvironmentFactory.parseXmlString (
"<jbpm-configuration>" +
" <process-engine>" +
" <object name='book' class='org.jbpm.examples.ch09.Book' />" +
" </process-engine>" +
"</jbpm-configuration>"
));
現在我們會創建一個環境塊,使用這個環境工廠, 我們會查找環境中的book. 第一次會使用類型查找 ,第二次會使用名稱查找。
Environment environment = environmentFactory.openEnvironment();
try {
Book book = environment.get(Book.class);
assertNotNull(book);
assertSame (book, environment.get("book"));
} finally {
environment.close();
}
為了防止這樣,你需要把環境作為一個參數傳遞給所有方法, 當前的環境被維護在一個threadlocal 棧中:
Environment environment = Environment.getCurrent();
11.5. 環境
環境可以動態被添加和刪除。 任何東西都可以暴露為一個Context.
public interface Context {
Object get(String key);
<T> T get (Class<T> type);
Set<String> keys();
...
}
當在環境中執行一次查找,這裡有一個默認的搜索次序 哪些環境會為請求的對象檢測。 默認次序與 環境添加的順序相反。 比如,如果一個對象被定義在流程引擎環境和塊環境中, 塊環境被認為更適用的 ,會被首先檢測。 可選的,一個默認的搜索次序可以被傳遞給get 作為一個可選的參數。