ラベル SpringFramework の投稿を表示しています。 すべての投稿を表示
ラベル SpringFramework の投稿を表示しています。 すべての投稿を表示

2008年3月19日水曜日

SpringIDEのインストール(Eclipse用SpringFrameworkプラグイン)

EclipseにSpringFrameworkのプラグインをインストールしてみました。

インストール方法は簡単で、「Feature Updates」で「Search for new features to install」を選択して、「Update sites to visit」の「New Remote Site」ボタンで

   http://springide.org/updatesite

を登録するだけです。その際Aspect Jのプラグイン(?)も必要になるようなので、併せてインストールしました。

以上です。

2008年3月18日火曜日

SpringFrameworkとHibernateの連係 -HibernateTemplate編-

SpringFrameworkとHibernateを連携する方法を調査してみました

参考: Chapter 12. Object Relational Mapping(ORM) data access

SessionFactoryの設定

リソースルックアップのハードコードを避けるために、SpringFrameworkではJDBCデータソースやHiberanteのSessionFactoryなどのリソースをビーンとして定義することができます。

<beans>
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="org.postgresql.Driver"/>
<property name="url" value="jdbc:postgresql://localhost:5432"/Tomcat/>
<property name="username" value="tomcat"/>
<property name="password" value="password"/>
</bean>
<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="myDataSource"/>
<property name="mappingResources">
<list>
<value>マッピングファイル1.hbm.xml</value>
</list>
<list>
<value>マッピングファイル2.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
</value>
</property>
</bean>
</beans>

HibernateTemplate

DAOもしくはビジネスサービスのメソッドの基本的なプログラムモデルは以下のようになります。

public class ProductDaoImpl implements ProductDao {

private HibernateTemplate hibernateTemplate;

public void setSessionFactory(SessionFactory sessionFactory) {
this.hibernateTemplate = new HibernateTemplate(sessionFactory);
}

public Collection loadProductsByCategory(String category) throws DataAccessException {
return this.hibernateTemplate.find("from test.Product product where product.category=?", category);
}
}

オブジェクトの実装に関して特に制限はありませんが、SessionFactoryを渡してやる必要があります。SessionFactoryはどこからでも呼び出せますが、できればSpring IOCコンテナからsetSessionFactory()メソッドを利用して、Beanとして呼び出します。その例を以下に示します。

<beans>
<bean id="myProductDao" class="product.ProductDaoImpl">
<property name="sessionFactory" ref="mySessionFactory"/>
</bean>
</beans>

HibernateTemplateクラスは上記のような便利なメソッドのほか、HiberanteのSessionインタフェースで公開されているメソッドを備えています。HiberanteTemplateにないメソッドを利用しようとしてSessionクラスへ直接アクセスするには、以下のようなコールバックベースの低レベルの方法をとることもできます。

public class ProductDaoImpl implements ProductDao {

private HibernateTemplate hibernateTemplate;

public void setSessionFactory(SessionFactory sessionFactory) {
this.hibernateTemplate = new HibernateTemplate(sessionFactory);
}

public Collection loadProductsByCategory(final String category) throws DataAccessException {
return this.hibernateTemplate.execute(new HibernateCallback() {

public Object doInHibernate(Session session) {
Criteria criteria = session.createCriteria(Product.class);
criteria.add(Expression.eq("category", category));
criteria.setMaxResults(6);
return criteria.list();
}
};
}
}
HibernateTemplateのAPI

 参考: Classs HibernateTemplate

Hibernateのデータアクセス処理を簡素化するヘルパークラス。org.springframework.daoの例外ヒエラルキーに沿ってHibernateExceptionをDataAccessExceptionへ自動的に変換します。
execute()が主となるメソッドで、HibernateCallbackインタフェースを実装したHibernateのアクセスコードを備えています。また、セッションの制御機能も備えており、Hibernateセッションの取得やクローズや関連した例外処理をする必要はありません。

2008年3月10日月曜日

Spring Frameworkの調査 -Introduction-

JavaでWebアプリケーションを開発することになったのでSpring Frameworkを調査してみました。

従来のMVCフレームワークの問題点とSpring Frameworkによるその解決

従来のMVCフレームワークには以下のような問題点があるようです。

  • レイヤー間の結合が密
    • 変更に弱い
    • レイヤー単体のテストが困難
  • トランザクションコード(データベースのトランザクションを管理するコード)が散在

Spring Frameworkを利用するとどうなるのかというと

  • 各レイヤーをインタフェースベースで連結するためレイヤー間の結合が疎
  • トランザクションコードをビジネスレイヤーから分離することができる
    • AOP(Aspect Oriented Programming)
その結果、機能拡張が容易になったりレイヤーごとの単体テストが実施できるようになったりするようです。

DIについて

DIはオブジェクトとオブジェクトを何らかの方法で関連付けし、関連付けられたオブジェクトを利用する側のオブジェクトでは、呼び出されるオブジェクトのインタフェースを利用してメソッドをcallすることになるので、オブジェクト間の結合が疎になります。

AOPについて

AOPはオブジェクトのメソッド実行時に動的に振る舞いを入れ込むことで、オブジェクトが本来処理するべき内容とそうでないものを分離することです。
例えばビジネスロジック内でDBアクセスを行うメソッドがある場合、そのメソッドの処理前と処理後にトランザクション開始とコミットの処理を動的に埋め込むことができるようになります。