Spring Frameworkの取扱い

基本情報

対応バージョン
Spring Framework 2.5.x 以上

DI設定ファイル (dbfluteBeans.xml)

DBFluteは、Generateタスクにて DBFluteのコンポーネントが登録されている dbfluteBeans.xml を自動生成します。主には、Behavior と allcommon のクラスが登録されています。

この dbfluteBeans.xml が アプリケーションのDI設定ファイルから参照されるように設定 することで、アプリケーションのコンポーネントからDBFluteのコンポーネント(主にBehavior)が利用できるようになります。

e.g. beanRefContext.xml にて dbfluteBeans.xml を参照 @beanRefContext.xml
<beans>
    <bean id="context" class="...support.ClassPathXmlApplicationContext">
        <constructor-arg>
            <list>
                <value>dbfluteBeans.xml</value>
                <value>jdbcBeans.xml</value>
            </list>
        </constructor-arg>
    </bean>
</beans>

データソースのコンポーネント名が dataSource でない場合

DBFluteは、dbfluteBeans.xml の中でデータソースを dataSource という名前で利用しますが、アプリケーションで管理するデータソースのコンポーネント名が違う名前の場合は、 データソースへの参照を適切なものに変更してあげる必要があります。(dbfluteBeans.xml は直接エディタで修正しても再自動生成時に上書きされます)

DBFluteプロパティ dependencyInjectionMap.dfprop の dbfluteBeansDataSourceName プロパティに、データソースの独自のコンポーネント名を指定して再自動生成して下さい。

dbfluteBeans.xml の名前を変更したい場合

DBFluteプロパティ dependencyInjectionMap.dfprop の dbfluteBeansFileName プロパティに、独自のファイル名を指定して再自動生成して下さい。(古いファイルは手動で削除)

DIの方法 (Behavior)

DI管理されているコンポーネントクラスにおいて、Behavior のプロパティを定義すると、Behavior がインジェクトされます。Behaviorは、dbfluteBeans.xml にて autowire="byType" と設定されているため、DI設定ファイル上で明示的にインジェクトする必要はありません。

プロパティ名は、Behaviorのクラス名の先頭を小文字(dbfluteBeans.xml上のコンポーネント名) にしたものになります。例えば、MemberBhv クラスなら、memberBhv となります。

e.g. プロパティ経由 {Pageクラス} @Java
public class XxxPage {
    protected MemberBhv memberBhv;

    ...

    public MemberBhv getMemberBhv() {
        return memberBhv;
    }

    public void setMemberBhv(MemberBhv memberBhv) {
        this.memberBhv = memberBhv;
    }
}

Commons DBCP との組み合わせ

Commons DBCP のデータソースは、スレッドトランザクションをサポートしていないため、DataSource から Connection を取得するときに、Spring Framework の DataSourceUtils を利用する必要があります。

もし、Commons DBCP を利用している場合は、(Spring Framework利用時のみ)内部的に Commons DBCP 対応の DataSourceHandler が DBFluteInitializer にて自動登録されます。

e.g. Commons DBCP 対応の DataSourceHandler の実装 @Java
public Connection getConnection(final DataSource ds) throws SQLException {
    final Connection conn = DataSourceUtils.getConnection(ds);
    if (DataSourceUtils.isConnectionTransactional(conn, ds)) {
        return new NotClosingConnectionWrapper(conn);
    } else {
        return conn;
    }
}

これにより、(スレッドトランザクションに対応していない) Commons DBCP 利用時も、ユーザはそれを特に意識せずにトランザクションを利用できるようになっています。

但し、アプリケーションで DBFluteConfig に独自の DataSourceHandler を設定したときは、その独自の DataSourceHandler は、デフォルトのものと同じ機能を持つ必要があります。 (アプリで明示的に設定された方が優先されるため)

Exampleのススメ

Spring Framework を使ったExample実装 dbflute-spring-example があります。

DBFlute Example - DIコンテナ