当前位置:首页 > 开发 > 系统架构 > 架构 > 正文

Spring 使用的设计模式(一) CallBack(回调)

发表于: 2013-10-28   作者:abc08010051   来源:转载   浏览:
摘要: 一 回调模式(CallBack)     1 类A持有一个类B的一个引用,类A并且实现了一个接口CallBack     2 类B有一个方法f,接收一个参数callBack,参数类型为CallBack,在方法f中调用了callBack的方法     下面是一个小例子:   &nbs

一 回调模式(CallBack)

    1 类A持有一个类B的一个引用,类A并且实现了一个接口CallBack

    2 类B有一个方法f,接收一个参数callBack,参数类型为CallBack,在方法f中调用了callBack的方法

    下面是一个小例子:

   

package com.malone.callBack;

public class CallBackDemo {

	public static void main(String[] args) {
		B b = new B();
		A a = new A(b);
		a.test();
	}
}

interface CallBack {
	public void doSomething();
}

class A implements CallBack {
	
	private B b;
	
	A(B b) {
		this.b = b;
	}
	
	public void test() {
		b.testB(this);
	}
	
	public void doSomething() {
		System.out.println("do something...");
	}
	
}

class B {
	
	public void testB(CallBack callBack) {
		System.out.println("========================");
		callBack.doSomething();
	}
	
	
}

在写了这个demo之后,一直思考使用CallBack的好处是什么?

 

 

二 Spring CallBack 模式的使用

    在Spring 中大量的使用了回调模式,很多都封装到了源码中,现在我举一个和我们写代码最相关的例子:HibernateCallback

    HibernateCallback:经常使用spring整合hibernate的程序员们都该知道,我们的Dao实现类一般都会继承HibernateDaoSupport,由此我们可以得到HibernateTemplate,spring对hibernate的操作进行了封装,

    HibernateTemplate提供了常规的CRUD操作,但是HibernateTemplate的封装也是程序失去了hibernate中直接使用Session操作的灵活性,所以HibernateTemplate提供了

    execute(CallBack action)等系列方法,允许程序员实现自己的HibernateCallBack,实现具体的逻辑。

    如下代码是HibernateTemplate如何具体使用HibernateCall(即回调的具体实现):

   

	public <T> T execute(HibernateCallback<T> action) throws DataAccessException {
		return doExecute(action, false, false);
	}

	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));
                        //在HibernateTemplate中得到实现,然后调用回调函数实现具体的逻辑
			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());
				}
			}
		}
	}

 由此可见,在此处使用回调模式,公共部分的操作都放在了hibernateTemplate的doExcute方法里,具体的实现让程序员来实现HibernateCallback回调接口,从而实现具体的逻辑,本人感觉这是CallBack模式的一大优点

 

Spring 使用的设计模式(一) CallBack(回调)

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
所谓回 调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B
在上一篇随笔中,搭建了一个寄宿于控制台项目的wcf服务和客户端.今天晚上时间比较充裕,看了下wcf的消
这几天编程序时遇到callback,还不是很明白,google了一下,下面这个解释太好了,在此记录。 来自ht
在asp.net中客户端与服务器端的交互默认都是整页面提交, 此时客户端将当前页面表单中的数据(包括
回调技术(CallBack) 在asp.net中客户端与服务器端的交互默认都是整页面提交, 此时客户端将当前页面
一、概念介绍 回调函数(callback Function),顾名思义,就是为被调用方所反过来调用的函数,即调
编程一段时间之后,都会或多或少的接触到“回调函数”的概念,我对这个概念的理解也是浅尝辄止,就
原创内容,转载请注明出处 1、模版模式 模版模式,顾名思义,是指将一些通用的行为实现都已完成,然
我们做过的很多项目中都会使用spring的JdbcTemplate进行结果集的查询操作,以前在使用的时候一直都
今天学习回调,回调分为更新回调、拣选回调、绘制。自以为顺序是从左到右的,即更新>拣选>绘
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号