●オブジェクトの生成(ffy_object_define.xmlファイルを使う方法)

FFYではオブジェクトを定義する為に2つの方法が用意されています。
1つは、xmlファイル(ffy_object_define.xml)に記述する方法。
もう1つは、アノテーションをソース中に記述する方法。
今回はxmlファイルに記述する方法を説明します。

基本的な構造は以下の通りです。

<?xml version="1.0" encoding="UTF-8" ?>
<ffyo:objects xmlns:ffyo="http://ffy.afy-system.jp/ffy_objects_define" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ffy.afy-system.jp/ffy_objects_define ffy_objects_define.xsd">
	<ffyo:annotation-support-library></ffyo:annotation-support-library>
	<ffyo:import></ffyo:import>
	<ffyo:object></ffyo:object>
</ffyo:objects>

<ffyo:annotation-support-library></ffyo:annotation-support-library>
これは、ソースコード中の@ObjectSupportを有効にするライブラリを指定します。
クラスパスに存在するjarファイルまたはclassディレクトリの名前を指定します。
例えば
classes
yourlib.jar
などを指定します。

<ffyo:import></ffyo:import>
これは、この定義ファイルを分割する為の設定です。
例えばサブシステムなどで定義ファイルを個別に持つ場合、この値を記述しておくことで
クラスパスに存在する指定された定義ファイルを有効にします。

<ffyo:object></ffyo:object>
これには様々なオブジェクトの定義を行うことが出来ます。
次の記述はごく簡単な例です。

<ffyo:object id="objectid" class-name="jp.co.sample.YourClass"></ffyo:object>

上の記述では objectid と言う名前で jp.co.sample.YourClass のオブジェクトを定義できます。
id属性には 識別する為のid(これをオブジェクトIDと呼びます)
class-name属性には対象のオブジェクトの完全限定名を指定します。
これ以外にもobjectタグには4つの属性があります。
aop-support属性はAopの機構をサポートするか否か
cache属性はこのインスタンスを常に使いまわすか否か
injection属性はそのインスタンスが持つsetterプロパティに対して自動でインジェクションするか否か
load-on-startup属性は起動時にインスタンスを生成するか否か

次の記述はオブジェクトのコンストラクタを指定する方法です。

<ffyo:object id="objectid" class-name="jp.co.sample.YourClass">
	<ffyo:constructor>
		<ffyo:param value="param1" />
		<ffyo:param value="param2" cast="java.lang.String"/>
	</ffyo:constructor>
</ffyo:object>

constructorタグの中にparamタグを追加することで希望のコンストラクタでインスタンスを生成できます。
paramタグは様々な記述をサポートします。また、複数の場所で記述が可能です。
paramタグのvalue属性についての詳細は後述します。

次の記述はオブジェクトにプロパティ値を設定する例です。

<ffyo:object id="objectid" class-name="jp.co.sample.YourClass">
	<ffyo:property name="property1" value="value1" />
</ffyo:object>

propertyタグはname属性のプロパティにvalue属性で指定した値をオブジェクトにセットする為に使用します。
value属性の記述は上述したparamタグのvalue属性と同じです。詳細は後述します。

次の記述はオブジェクトが持つメソッドを実行する記述例です。

<ffyo:object id="objectid" class-name="jp.co.sample.YourClass">
	<ffyo:method name="methodName">
		<ffyo:param value="param1" />
	</ffyo:method>
</ffyo:object>

methodタグを記述することでオブジェクトをインスタンス化するタイミングで、そのメソッドを実行することが出来ます。
methodタグにはconstructorタグと同様にparamタグを記述することが出来ます。

最後にparamタグ、propertyタグに記述するvalue属性の詳細を説明します。
次の記述がvalue属性の記述例です。(propertyタグで記述しますがvalueタグでも同じ記述が可能です。)

<ffyo:object id="objectid" class-name="jp.co.sample.YourClass">
	<ffyo:property name="property1" value="object">
		<ffyo:inner-object class-name="jp.co.sample.OtherClass"></ffyo:inner-object>
	</ffyo:property>
	<ffyo:property name="property2" value="external-method">
		<ffyo:external-method refid="refobjectid" name="method1">
			<ffyo:param value="" />
		</ffyo:external-method>
	</ffyo:property>
	<ffyo:property name="property3" value="static-method">
		<ffyo:static-method class-name="jp.co.sample.OtherClass" name="staticMethod1">
			<ffyo:param value="" />
		</ffyo:static-method>
	</ffyo:property>
	<ffyo:property name="property4" value="static-field">
		<ffyo:static-field class-name="jp.co.sample.OtherClass" name="STATIC_FILED1"/>
	</ffyo:property>
	<ffyo:property name="property5" value="this">
	</ffyo:property>
	<ffyo:property name="property6" value="properties:propid.propkey">
	</ffyo:property>
	<ffyo:property name="property7" value="ref:refobjectid">
	</ffyo:property>
	<ffyo:property name="property8" value="propertyValue">
	</ffyo:property>
</ffyo:object>

上の例の通り、8パターンの記述方法があります。

1つ目はそこでしか使用しないオブジェクトのインスタンスを生成して設定する方法です。
value属性には[object]と記述します。
その上で、ネスとするタグにinner-objectタグを記述します。
inner-objectタグはobjectタグとほぼ同じ記述方法です。
唯一異なる点はid属性を持たないことです。
これは、このオブジェクトがここでしか使用されない為です。
objectタグで定義したobjectを指定する方法は7つ目の方法で説明します。

2つ目は外部メソッドの戻り値を設定する方法です。
value属性には[external-method]と記述します。
その上で、ネスとするタグにexternal-methodタグを記述します。
external-methodタグのrefid属性に別のobjectタグで定義したidを指定します。
name属性にはrefidに指定したオブジェクトの実行するメソッド名を指定します。
メソッドに渡すパラメータはparamタグで指定することが出来ます。

3つ目はstaticメソッドの戻り値を設定する方法です。
value属性には[static-method]と記述します。
その上で、ネスとするタグにstatic-methodタグを記述します。
static-methodタグはexternal-methodとほぼ同じです。
唯一異なる点はrefid属性の代わりにclass-name属性に完全限定名を指定することです。

4つ目はstaticフィールド値を設定する方法です。
value属性には[static-field]と記述します。
その上で、ネスとするタグにstatic-fieldタグを記述します。
class-name属性には対象の完全限定名を指定し、name属性にフィールド名を指定します。

5つ目はthisインスタンスを設定方法です。
value属性には[this]と記述します。
これは設定を記述しているオブジェクト自身のthisインスタンスを渡すことが出来ます。

6つ目はプロパティファイルに記述した値を設定する方法です。
value属性には[properties:プロパティ管理ID.プロパティキー名]と記述します。
プロパティ管理IDにはffy_core_config.xmlで記述するプロパティ情報で定義した物を指定します。
プロパティキー名はそのプロパティファイルに存在するキーを指定します。

7つ目は別定義オブジェクトを設定する方法です。
value属性には[ref:オブジェクトID]と記述します。
この記述により別のobjectタグで定義されたオブジェクトIDのインスタンスを設定することが出来ます。

8つ目は「値」を設定する方法です。
ここで言う「値」とは主にプリミティブ型の値を指します。
value属性に記述された値が上の7パターンにマッチしない場合にこのパターンが適用されます。
ffyはこの値の設定先のメソッドのパラメータ型に合わせて、コンバータ機構(IConverter)で適切な型に変換したものを渡します。

ここで定義したオブジェクトをJavaから参照する方法と、上記の定義をアノテーションで行う方法については別に説明します。