Powered by Google App Engine

Seasar

 

creatorを自作する

creatorを自作して、特定クラスをコンポーネントに簡単に登録する事ができます。バッチ実行時に簡単にコンポーネントからクラスを取得する事ができるようになります。

新サイト、tree-mapsを公開しました!!

tree-maps: 地図のWEB TOOLの事ならtree-mapsにお任せ!

地図に関するWEB TOOL専門サイトです!!

大画面で大量の緯度経度を一気にプロット、ジオコーディング、DMS<->DEGの相互変換等ができます!

◯ 広告

creator.diconに、デフォルトで沢山creatorクラスが登録されています。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" 
	"http://www.seasar.org/dtd/components24.dtd">
<components>
	<include path="convention.dicon"/>
	<include path="customizer.dicon"/>
	<component name="interceptorCreator" class="org.seasar.framework.container.creator.InterceptorCreator"/>
	<component name="logicCreator" class="org.seasar.framework.container.creator.LogicCreator"/>
	<component name="serviceCreator" class="org.seasar.framework.container.creator.ServiceCreator"/>
・・・略・・・

これらcreatorは、特定のプレフィックス・サフィックスのクラスを自動的にコンポーネントに登録する処理をします。

WEBアプリケーションの場合はコンポーネントの登録関連は問題になる事は少ないと思います。

しかしスタンドアローンのバッチプロジェクトでは「コンポーネントが見つかりませんでした」というエラーをよく見かけますね。

これを簡単に解決する方法の一つとして、creatorを独自に作成する方法があります。

creatorが具体的に何をしているか、例えばLogicCreator.javaを見てみましょう。

public class LogicCreator extends ComponentCreatorImpl {

    /**
     * {@link LogicCreator}を作成します。
     * 
     * @param namingConvention
     */
    public LogicCreator(NamingConvention namingConvention) {
        super(namingConvention);
        setNameSuffix(namingConvention.getLogicSuffix());
        setInstanceDef(InstanceDefFactory.PROTOTYPE);
    }

    /**
     * Logic用の {@link ComponentCustomizer}を返します。
     * 
     * @return
     */
    public ComponentCustomizer getLogicCustomizer() {
        return getCustomizer();
    }

    /**
     * Logic用の {@link ComponentCustomizer}を設定します。
     * 
     * @param customizer
     */
    public void setLogicCustomizer(ComponentCustomizer customizer) {
        setCustomizer(customizer);
    }
}

思ったよりシンプルな作りですね。これなら独自のcreatorを簡単に作れそうです。

ではwebアプリではなく、バッチのプロジェクトでバッチクラスをコンポーネントから取得するBatchCreatorを作ります。

今回は、クラス名のサフィックスが「Batch」となるクラスを自動的にコンポーネントに登録されるようにします。

import org.seasar.framework.container.ComponentCustomizer;
import org.seasar.framework.container.assembler.AutoBindingDefFactory;
import org.seasar.framework.container.creator.ComponentCreatorImpl;
import org.seasar.framework.container.deployer.InstanceDefFactory;
import org.seasar.framework.convention.NamingConvention;

public class BatchCreator extends ComponentCreatorImpl {

	public BatchCreator(NamingConvention namingConvention) {
		super(namingConvention);
		setNameSuffix("Batch");
		setInstanceDef(InstanceDefFactory.SINGLETON);
		setAutoBindingDef(AutoBindingDefFactory.AUTO);
	}

	public ComponentCustomizer getBatchCustomizer() {
		return getCustomizer();
	}

	public void setBatchCustomizer(ComponentCustomizer customizer) {
		setCustomizer(customizer);
	}
}

ComponentCreatorImplを継承して、後はLogicCreatorを参考に作るだけです。

今回はinstance属性をsingletonとしましたが、任意に変更して下さい。

バッチプロジェクトは基本smart deployかと思うので、prototypeでいいかもしれません。

setNameSuffixで、クラスのサフィックスを設定します。

setNamePrefixは無いです。seasarに設計思想がsuffixを基準にしているから無いのでしょう。

creator.dicon

creator.diconはネーミング規約に基づいてコンポーネント定義を作成するCreatorを定義するdiconファイルで,SMART deployを利用する場合に必要となります.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" 
	"http://www.seasar.org/dtd/components24.dtd">
<components>
	<include path="convention.dicon"/>
	<include path="customizer.dicon"/>
	<component name="interceptorCreator" class="org.seasar.framework.container.creator.InterceptorCreator"/>
	<component name="logicCreator" class="org.seasar.framework.container.creator.LogicCreator"/>
	<component name="serviceCreator" class="org.seasar.framework.container.creator.ServiceCreator"/>
	<!-- ↓↓↓ こんな感じで追加して下さい ↓↓↓ -->
	<component name="batchCreator" class="tree.batch.s2.creator.BatchCreator"/>
・・・略・・・

customizer.dicon

customizer.diconはCreatorが作成したコンポーネント定義をカスタマイズするCustomizerを定義するdiconファイルで,SMART deployを利用する場合に必要となります.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" 
	"http://www.seasar.org/dtd/components24.dtd">
<components>
	<include path="default-customizer.dicon"/>

    <!-- ↓↓↓ こんな感じで追加して下さい ↓↓↓ -->
	<component name="batchCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain">
		<initMethod name="addAspectCustomizer">
			<arg>"aop.traceInterceptor"</arg>
		</initMethod>
	</component>
</components>
import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;

public class TestBatch {

	public static void main(String[] args) {
		TestBatch creatorSample = new TestBatch();
		creatorSample.execute();
	}

	private void execute() {
		SingletonS2ContainerFactory.init();
		S2Container container = SingletonS2ContainerFactory.getContainer();
		RssBatch rssBatch = (RssBatch) container.getComponent(RssBatch.class);
		rssBatch.run();
	}
}

こんな感じでバッチクラスをコンポーネントから取得できるようになります。

treeおすすめの書籍です!
【送料無料】実践ハイパフォ-マンスMySQL第2版

【送料無料】実践ハイパフォ-マンスMySQL第2版
価格:4,830円(税込、送料別)

【送料無料】エキスパ-トのためのMySQL運用+管理トラブルシュ-ティングガイド

【送料無料】エキスパ-トのためのMySQL運用+管理トラブルシュ-ティングガイド
価格:3,465円(税込、送料別)

【送料無料】基礎からのMySQL改訂版

【送料無料】基礎からのMySQL改訂版
価格:3,129円(税込、送料別)

◯ 広告