これらのフレームワークを一緒に使用する方法を示します。私は HibernateTemplate の必要性を避けています。このクラスはあまりにも制限されていると思います。セッションを直接使用することを好みます。
プロジェクトに Spring があれば、Daos に Hibernate SessionFactory を注入する必要があるため、セッションを処理できます。まず、applicationContext.xml で SessionFactory を構成する必要があります。
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
これで、 @Autowired アノテーションを使用して SessionFactory を注入できます。
@Repository
public class HibernateProductDao implements ProductDao {
private final SessionFactory factory;
@Autowired
public HibernateProductDao(final SessionFactory factory) {
this.factory = factory;
}
public List<Product> findAll() {
return factory.getCurrentSession().createCriteria(Product.class).list();
}
public void add(final Product product) {
factory.getCurrentSession().save(product);
}
}
ここにいくつか重要なことがあります。メソッド getCurrentSession() を使用する必要があります。これにより、Spring がセッションのライフサイクルを制御できるようになります。代わりに getSession() を使用する場合は、自分の責任になります。たとえば、セッションを閉じます。
それでは、Struts 2 を構成しましょう。web.xml で:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
Spring がオブジェクトを作成すると言うには、ファイル struts.xml も必要です。
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.objectFactory" value="spring" />
</struts>
最後に、アクションに Dao を挿入できます。
public class ProductAction {
private ProductDao dao;
@Autowired
public ProductAction(ProductDao dao) {
this.dao = dao;
}
}
もちろん、Spring アノテーションを使用しているため、component-scanでパッケージをスキャンする必要があります。
これが、このフレームワークを統合するために私が見つけた最良の方法です。お役に立てば幸いです。