Top / Java / Pingアプリケーション / SpringでDIしてDAOをつくる

アプリケーションの設定はDIコンテナであるSpringを使用します。とくにSpringにはHibernateと連携する機能があり、HibernateのDAOを作成するのにSpringを使うと非常に便利です。

Hibernate関連のSpringの設定ファイル

hibernate-spring.xmlという名前で、Hibernate関連のSpringの設定ファイルを作成します。内容は以下の通りです。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
   "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
  <!-- WEBコンテナのDataSourceを使う設定 -->
  <bean id="dataSource" 
    class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName">
      <value>java:comp/env/jdbc/MySqlDS</value>
    </property>
  </bean>
  
  <bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource">
      <ref local="dataSource" />
    </property>
    <property name="configLocation">
      <value>/WEB-INF/hibernate.cfg.xml</value>
      <!-- Mappingクラスだけhibernate.cfg.xmlに書く  -->
    </property>
    <property name="configurationClass">
      <value>org.hibernate.cfg.AnnotationConfiguration</value>
    </property>
  </bean>
</beans>

ちなみに、hibernate.cfg.xmlは以下のようにしました。基本的にマッピングクラスの指定だけが書いてあります。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
  "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <mapping class="nu.mine.kino.rss.hibernate.Rss" />
  </session-factory>
</hibernate-configuration>

DAOのインタフェース

また、RSSテーブルにアクセスするDAOのインターフェースを以下のように定義します。

public interface RssDAO {
    public Rss findById(int id);
    public Rss[] findAll();
    public void save(Rss rss);
    public void delete(Rss rss);
}

DAOの実装クラス

実装クラス(RssDAOImpl)は以下の通りです。ポイントとしては

  • Springが提供してくれるHibernateDaoSupport を拡張する
  • HibernateDaoSupportのフィールドには先のhibernate-spring.xmlからInjectionする
  • DAOImpl自体のSpringの設定ファイルは、設定をソースコードに書いてXDocletで自動生成する

としたいと思います。

/*******************************************************************************
 * Copyright (c) 2005 Masatomi KINO.
 * All rights reserved. 
 * $Id: RssDAOImpl.java,v 1.2 2006/02/23 17:30:19 cvsuser Exp $
 *******************************************************************************/
//作成日: 2005/10/30
package nu.mine.kino.rss.dao;

import java.util.List;
import nu.mine.kino.rss.hibernate.Rss;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

/**
 * @author Masatomi KINO
 * @version $Revision: 1.2 $
 * @spring.bean id = "rssDao"
 * @spring.property name = "sessionFactory" ref = "sessionFactory"
 */
public class RssDAOImpl extends HibernateDaoSupport implements RssDAO {
  public Rss findById(int id) {
    return (Rss) getHibernateTemplate().get(Rss.class, new Integer(id));
  }
  public Rss[] findAll() {
    List list = getHibernateTemplate().loadAll(Rss.class);
    return (Rss[]) list.toArray(new Rss[list.size()]);
  }
  public void save(Rss rss) {
    getHibernateTemplate().save(rss);
  }
  public void delete(Rss rss) {
    getHibernateTemplate().delete(rss);
  }
}

クラスコメントの

* @spring.bean id = "rssDao"
* @spring.property name = "sessionFactory" ref = "sessionFactory"

によって、

  • このクラスのidはrssDaoであること
  • (HibernateDaoSupportの)フィールド sessionFactory はhibernate-spring.xmlのsessionFactory がInjectionされること

ということになります。XDocletを通すことによってbean.xmlというSpringの設定ファイルが自動生成され、その中にこの@springによる情報も記述されます。自動生成されるbean.xmlは以下の通り:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC
    "-//SPRING//DTD BEAN//EN"
    "http://www.springframework.org/dtd/spring-beans.dtd">
<beans
  default-autowire="no"
  default-lazy-init="false"
  default-dependency-check="none"
>
  <bean
      id="rssDao"
      class="nu.mine.kino.rss.dao.RssDAOImpl"
  >
    <property name="sessionFactory">
      <ref bean="sessionFactory"/>
    </property>
  </bean>
</beans>
bean.png
EA4.png

これで、以下のようにRSSテーブルにアクセスすることができるようになりました。

import nu.mine.kino.rss.dao.RssDAO;
import nu.mine.kino.rss.hibernate.Rss;

import org.apache.log4j.BasicConfigurator;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author Masatomi KINO
 * @version $Revision: 1.1 $
 */
public class TestDAOMain {
  public static void main(String[] args) {
    BasicConfigurator.configure();
    System.out.println("Start.");


    ApplicationContext factory = new ClassPathXmlApplicationContext(
        new String[] { "hibernate-spring.xml", "beans.xml" });
    RssDAO rssDAO = (RssDAO) factory.getBean("rssDao");
    Rss[] rsss = rssDAO.findAll();
    for (Rss rss : rsss) {
      System.out.printf("%2d - %s%n", rss.getId(), rss.getTitle());
      System.out.println(rss);
    }

    System.out.println("End.");

  }
}

この記事は

選択肢 投票
おもしろかった 9  
そうでもない 3  

Top / Java / Pingアプリケーション / SpringでDIしてDAOをつくる

現在のアクセス:15696


添付ファイル: fileEA4.png 1014件 [詳細] filebean.png 1025件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-09-01 (火) 14:33:40 (3153d)