3.5. オブジェクトファクトリ

オブジェクトファクトリは、Bean のような XML 設定ファイルに含まれる仕様に従ったオブジェクトを構築できます。このファイルは、オブジェクトグラフを構成するために、どのようにオブジェクトが作成、設定、配線されるかを決定します。
また、オブジェクトファクトリを使用して設定や他の Bean を主要 Bean に挿入できます。
下記の例のように最も簡単な構成では、オブジェクトファクトリは設定より基本タイプと Java Bean の両方を作成することができます。
<beans>
    <bean name="task" class="org.jbpm.taskmgmt.exe.TaskInstance"/>
    <string name="greeting">hello world</string>
    <int name="answer">42</int>
    <boolean name="javaisold">true</boolean>
    <float name="percentage">10.2</float>
    <double name="salary">100000000.32</double>
    <char name="java">j</char>
    <null name="dusttodust" />
</beans>
ObjectFactory of = ObjectFactory.parseXmlFromAbove();
assertEquals(TaskInstance.class, of.getNewObject("task").getClass());
assertEquals("hello world", of.getNewObject("greeting"));
assertEquals(new Integer(42), of.getNewObject("answer"));
assertEquals(Boolean.TRUE, of.getNewObject("javaisold"));
assertEquals(new Float(10.2), of.getNewObject("percentage"));
assertEquals(new Double(100000000.32), of.getNewObject("salary"));
assertEquals(new Character('j'), of.getNewObject("java"));
assertNull(of.getNewObject("dusttodust"));]]>
このコードはリストの設定方法を表しています。
<beans>
    <list name="numbers">
        <string>one</string>
        <string>two</string>
        <string>three</string>
    </list>
</beans>
これはマップの設定方法を表しています。
<beans>
    <map name="numbers">
        <entry>
            <key><int>1</int></key>
            <value><string>one</string></value>
        </entry>
        <entry>
            <key><int>2</int></key>
            <value><string>two</string></value>
        </entry>
        <entry>
            <key><int>3</int></key>
            <value><string>three</string></value>
        </entry>
    </map>
</beans>
直接フィールド注入 とプロパティ setter メソッドを使用して Bean を設定します。このコードはその方法を示しています。
<beans>
    <bean name="task" class="org.jbpm.taskmgmt.exe.TaskInstance" >
        <field name="name"><string>do dishes</string></field>
        <property name="actorId"><string>theotherguy</string></property>
    </bean>
</beans>
Bean は参照可能です。参照されるオブジェクトは Bean である必要はなく、ストリングや整数、他のオブジェクトにすることが可能です。
<beans>
    <bean name="a" class="org.jbpm.A" />
    <ref name="b" bean="a" />
</beans>
Bean を構築したいコンストラクターを利用することができます。
<beans>
    <bean name="task" class="org.jbpm.taskmgmt.exe.TaskInstance" >
        <constructor>
            <parameter class="java.lang.String">
                <string>do dishes</string>
            </parameter>
            <parameter class="java.lang.String">
                <string>theotherguy</string>
            </parameter>
        </constructor>
    </bean>
</beans>
クラス上で static factory メソッドを使用して Bean を構築することができます。
<beans>
    <bean name="taskFactory" 
        class="org.jbpm.UnexistingTaskInstanceFactory" 
        singleton="true"/>

    <bean name="task" class="org.jbpm.taskmgmt.exe.TaskInstance" >
        <constructor factory="taskFactory" method="createTask" >
            <parameter class="java.lang.String">
                <string>do dishes</string>
            </parameter>
            <parameter class="java.lang.String">
                <string>theotherguy</string>
            </parameter>
        </constructor>
    </bean>
</beans>
クラス上で static factory メソッドを使用して Bean を構築することができます。
<beans>
    <bean name="task" class="org.jbpm.taskmgmt.exe.TaskInstance" >
        <constructor
            factory-class="org.jbpm.UnexistingTaskInstanceFactory"
            method="createTask" >
            <parameter class="java.lang.String">
                <string>do dishes</string>
            </parameter>
            <parameter class="java.lang.String">
                <string>theotherguy</string>
            </parameter>
        </constructor>
    </bean>
</beans>
singleton="true" を使用して各名前付きのオブジェクトを singleton としてマークします。これにより、各要求に対して object factory が常に同じオブジェクトを返すようにします。

注記

Singletons を異なるオブジェクトファクトリで共有することはできません。

注記

singleton 機能により、getObject というメソッドと getNewObject というメソッドを区別することができます。新しいオブジェクトグラフが構築される前に object factoryオブジェクトキャッシュを消去するため、通常は getNewObject を使用します。
オブジェクトグラフの構築中、 非シングルトンオブジェクトobject factory のキャッシュに保存されます。 これにより、 1 つのオブジェクトへの参照を共有できるようになります。 singleton object cacheplain object cache とは異なります。 singleton キャッシュは消去されることがありませんが、 plain object cache メソッドが開始される度に plain object cache は消去されます。
本章の内容を理解できれば、多くの可能な JBPM の設定方法について十分な知識を得たことになります。