Spring的AOP HibernateInterceptor是作为HibernateTemplate的替换, 它在一个委托的try/catch块中直接写Hibernate代码, 以及在application context中的一个interceptor定义,从而代替callback的实现。下面演示了在application context中DAO,interceptor以及proxy定义,同时还有一个DAO方法的具体实现:
<beans>
<bean id="myHibernateInterceptor"
class="org.springframework.orm.hibernate.HibernateInterceptor">
<property name="sessionFactory">
<ref bean="mySessionFactory"/>
</property>
</bean>
<bean id="myProductDaoTarget" class="product.ProductDaoImpl">
<property name="sessionFactory">
<ref bean="mySessionFactory"/>
</property>
</bean>
<bean id="myProductDao" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>product.ProductDao</value>
</property>
<property name="interceptorNames">
<list>
<value>myHibernateInterceptor</value>
<value>myProductDaoTarget</value>
</list>
</property>
</bean>
</beans>
public class ProductDaoImpl extends HibernateDaoSupport implements ProductDao {
public List loadProductsByCategory(final String category) throws MyException {
Session session = SessionFactoryUtils.getSession(getSessionFactory(), false);
try {
List result = session.find("from test.Product product where product.category=?",category, Hibernate.STRING);
if (result == null) throw new MyException("invalid search result");
return result;
}
catch (HibernateException ex) throw SessionFactoryUtils.convertHibernateAccessException(ex);
}
}
这个方法必须要有一个HibernateInterceptor才能工作。 getSession方法中的”false”标志为了确保Session已经存在, 否则SessionFactoryUtils会创建一个新的。如果线程中已经存在一个 SessionHolder比如一个HibernateTransactionManager事务 ,那SessionFactoryUtils 就肯定会自动参与进来。HibernateTemplate 在内部使用SessionFactoryUtils, 他们是一样的底层结构。HibernateInterceptor最主要的优点是允许在数据访问代码中抛出checked应用异常,而HibernateTemplate在回调中严格限制只能抛出未检查异常。 值得注意的是我们可以把各种check以及抛出应用异常推迟到回调之后。 Interceptor的主要缺点是它需要在context进行特殊的装配。HibernateTemplate的简便方法在很多场景下更简单些




















