Kinopyo Blog

プログラマとしてRuby, Rails, iPhone, iPad,Macなどなどと向き合う日々のログポース

Archive for the ‘Spring’ Category

Spring DataSource beanのメモ

2010年12月06日

DataSource Beanを定義する際applicationContext.xmlの書き方と、Javaで呼び出すコードのメモです。ずいぶん昔のメモです。。

こんなjdbc.propertiesファイルがクラスパスにあるとします。

jdbc.driverClassName=org.h2.Driver
jdbc.url=jdbc:h2:~/test
jdbc.username=sa
jdbc.password=

そしてSpringのapplicationContext.xmlにはこう書きます。

<context:property-placeholder location="jdbc.properties"/>

<bean id="dataSource"
	class="org.springframework.jdbc.datasource.DriverManagerDataSource">
	<property name="driverClassName" value="${jdbc.driverClassName}" />
	<property name="url" value="${jdbc.url}" />
	<property name="username" value="${jdbc.username}" />
	<property name="password" value="${jdbc.password}" />
</bean>

<bean id="accountDao" class="test.dao.AccountDao">
	<property name="dataSource" ref="dataSource" />
</bean>

Javaでの呼び出し:

ApplicationContext context = new ClassPathXmlApplicationContext(
		"applicationContext.xml");

AccountDao accountDao = (AccountDao) context.getBean("accountDao");

// other code...

SpringでH2 Databaseを使う(HSQL、Derby)

2010年11月29日

Springのコンテキストファイルにjdbc:embedded-databaseタグで

type=”H2″でbeanを登録します。

jdbc:scriptタグで初期化時に実行したいSQLファイルを指定できます。

Sprintって、本当に便利ですね。

<jdbc:embedded-database id="dataSource" type="H2">
	<jdbc:script location="classpath:schema.sql"/>
	<jdbc:script location="classpath:test-data.sql"/>
</jdbc:embedded-database>

ちなみにjdbcのnamespaceの登録も忘れずに。

xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc

http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd">

H2以外でもHSQL、Derbyがサポートされています。

Spring: @Serviceと@Componentの区別は?

2010年01月15日

@ComponentアノテーションはJavaのクラスにつけるもので

このクラスをコンテナが管理するBeanとして登録する機能です。

@Serviceアノテーションも現状では@Componentと違いはありませんが、

通常サービス層のコンポネントは@Serviceアノテーションをつけます。

その理由は主に以下の二つです。

  • コンポーネントがサービス層のコンポーネントを明確にする意味で
  • 今後@Serviceアノテーションを付与したBeanには自動的にトランザクション管理の機能が付与されるなどの機能拡張も期待される


Spring3.0のリリースノートを見たところ特に@Serviceに関する変更はないみたいです。

なのでサービス層のクラスに対して@Componentか@Serviceか悩んでるんだっだら

@Serviceをつけた方がいいでしょう。


参考サイト:

Spring 2.5の新機能を使ってアプリケーションを作る(その1)

Springによる単体テストの促進

2009年12月28日

なぜDIコンテナを使うのかの勉強メモです。

SpringをはじめとするDIフレームワークでは、他クラスへの依存はインターフェイスを介したものになります。インターフェイスを介するため、呼び出す側はそのインターフェイスを実装しているクラスの完成を待つ必要がなくなります。DIコンテナを利用すればDIコンテナが設定ファイルの記述に従ってインターフェイスの実装クラスをセットします。そのため、設定ファイルの内容を切り替えることで単体テスト用のモックオブジェクト(ダミーオブジェクト)に切り替えることができます。

サンプル

JuchuImplクラスはZaikoHikiateImplクラスに依存しています。

そのためJuchuImpl単体のテストを行おうとしても、

ZaikoHikiateImplクラスのhikiate()メソッドにバグがある場合テストができませんでした。

単体テストを行いにくいクラス

public class JuchuImpl implements Juchu {

    public void juchu(Integer syohinCode, Integer suryo) {

        ZaikoHikiate hikiate = new ZaikoHikiateImpl();

        hikiate.hikiate(syohinCode, suryo);

        // 受注を処理 

    }

}
DIにより依存を低めたクラス

public class JuchuImpl implements Juchu {

    private ZaikoHikiate hikiate;

    public void setHikiate(ZaikoHikiate hikiate) {

        this.hikiate = hikiate;

    }

    public void juchu(Integer syohinCode, Integer suryo) {

        hikiate.hikiate(syohinCode, suryo);

        // 受注を処理

    }

}

JuchuクラスはZaikoHikiateImplクラスが完成していなくても

ZaikoHikiateインターフェイスを実装したモックオブジェクトを

DIコンテナにセットしてJuchuImplの単体テストを実行できます。