http://yiben-tech.com/lmx/paper/59
Spring中 Callback模式和Template模式合用 随处可见。下面以常用的HibernateTemplate为例进行简要简述。
由于java的JDBC的开发过程中有许多步骤是固定的(建立连接,执行操作,释放连接),因此spring采用模板方法对JDBC开发进行改进。模板方法定义过程的架构,一般是在一个抽象类中定义某个操作的一系列过程,将这一系列的过程中的变化部分以抽象方法的形式给出,子类在进行这个操作时,只需要继承该抽象类,重写该抽象方法即可。代码如下:
public abstract class Ope{
public final void step1(){..}
public abstract void step2();
public final void step3(){…}
public final void execute(){
step1();
step2();
step3();
}
}
public class MyOpe extends Ope{
public void step2(){…}
//public final void execute(){
//step1();
//step2();
//step3();
//}
}
这样,每一个具体的操作只需要实现step2()方法即可。
但是如果仅仅采用模板方法,就意味着每次进行增删改查操作,都需要继承某个类,在java开发中通常会频繁操作数据库,这种方法会显得十分的不方便。通常我们利用HibernateTemplate进行数据库操作时,是采用类似ht.save(…)的方式,
在一个模板类中实现了所有的方法,而这其中用到了Callback模式。
在HibernateTemplate模板类中有一个核心的方法,这个核心的方法完成相关的流程操作,其中的具体步骤通过回调传入的对象来完成(这个对象就是实现了Callback接口的类)。该类中的其它的方法(如save,update等)会通过Callback模式,调用这个核心的方法实现来完成最终的操作。这样就不需要实现多个类,只需在一个模板类中就可以完成全部的方法定义。
HibernateCallback接口的代码如下:
public interface HibernateCallback<T> {
T doInHibernate(Session session) throws HibernateException, SQLException;
}
它只有一个方法doInHibernate 。HibernateTemplate中的方法,如save(),update()的具体实现都采用匿名类的方式实现了该接口,在doInHibernate中完成具体的操作。以save()方法为例:
public Serializable save(final Object entity) throws DataAccessException {
return executeWithNativeSession(new HibernateCallback<Serializable>() {
public Serializable doInHibernate(Session session)
throws HibernateException {
checkWriteOperationAllowed(session);
return session.save(entity);
}
});
}
save方法在doInHibernate方法中完成了session.save(entity)完成保存操作,而executeWithNativeSession方法可以看做是HibernateTemplate中的核心方法(它内部调用了doExecute()方法,doExecute()方法才是真正的核心方法,它完成了一系列操作)
protected <T> T doExecute(HibernateCallback<T> action, boolean enforceNewSession, boolean enforceNativeSession)
throws DataAccessException {
Assert.notNull(action, "Callback object must not be null");
Session session = (enforceNewSession ?
SessionFactoryUtils.getNewSession(getSessionFactory(), getEntityInterceptor()) : getSession());
boolean existingTransaction = (!enforceNewSession &&
(!isAllowCreate() || SessionFactoryUtils.isSessionTransactional(session, getSessionFactory())));
if (existingTransaction) {
logger.debug("Found thread-bound Session for HibernateTemplate");
}
FlushMode previousFlushMode = null;
try {
previousFlushMode = applyFlushMode(session, existingTransaction);
enableFilters(session);
Session sessionToExpose =
(enforceNativeSession || isExposeNativeSession() ? session : createSessionProxy(session));
T result = action.doInHibernate(sessionToExpose);
flushIfNecessary(session, existingTransaction);
return result;
}
catch (HibernateException ex) {
throw convertHibernateAccessException(ex);
}
catch (SQLException ex) {
throw convertJdbcAccessException(ex);
}
catch (RuntimeException ex) {
// Callback code threw application exception...
throw ex;
}
finally {
if (existingTransaction) {
logger.debug("Not closing pre-bound Hibernate Session after HibernateTemplate");
disableFilters(session);
if (previousFlushMode != null) {
session.setFlushMode(previousFlushMode);
}
}
else {
// Never use deferred close for an explicitly new Session.
if (isAlwaysUseNewSession()) {
SessionFactoryUtils.closeSession(session);
}
else {
SessionFactoryUtils.closeSessionOrRegisterDeferredClose(session, getSessionFactory());
}
}
}
}
spring中的JdbcTemplate等都采用了相同的方法。
分享到:
相关推荐
Spring 数据库访问的支持。包括统一异常体系和Spring的Template+CallBack的解读
spring、ioc、aop、callback,自己写着玩,感觉挺不错的,也能加深对框架等理解
本文实例分析了C++中回调函数(CallBack)的用法。分享给大家供大家参考。具体分析如下: 如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。 其错误是普通的C++成员函数都隐含了一个传递...
C++中回调(CallBack)的使用思路C++中回调(CallBack)的使用思路C++中回调(CallBack)的使用思路
简单易懂,快速了解WCF如何CallBack
该库旨在将的易用性与 Spring 和 Spring Integration 框架的强大功能结合起来。 显着的特点包括: 使用方法注释的声明性订阅者注册 异步事件使用可配置的 交易订阅者支持 基于每个订阅者的同步或异步行为 使用时...
除了大量使用Template Method来封装一些底层的操作细节,spring也大量使用callback方式类回调相关类别的方法以提供JDBC相关类别的功能,使传统的JDBC的使用者也能清楚了解spring所提供的相关封装类别方法的使用。
这是一个及其简单的但是又实用的callBack
callback
xe datasnap CallBack
易语言Callback数据类型转易语言子程序源码.rar 易语言Callback数据类型转易语言子程序源码.rar 易语言Callback数据类型转易语言子程序源码.rar 易语言Callback数据类型转易语言子程序源码.rar 易语言Callback...
回调技术(CallBack), 详细阐述请参见:http://blog.csdn.net/kissqi/archive/2009/03/13/3988052.aspx
json+callback实现无刷新demo,短小精悍
Delphi MIDAS 回调 (CallBack) Delphi MIDAS 回调 (CallBack)
封装了两种callback,一种是返回string类型,在子类进行json解析;一种是传入泛型的javabean,解析完了传回子类
回调函数Callback_Function
ASP.NET2.0实现无刷新客户端回调的Callback机制
简单的RMI CallBack调用示例!
android hello-jniCallback sample
Callback数据类型转易语言子程序源码,易语言数据类型转换