`

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

阅读更多

一 回调模式(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模式的一大优点

 

分享到:
评论

相关推荐

    59丨模板模式(下):模板模式与Callback回调函数有何区别和联系?1

    模板模式是一种行为设计模式,它定义了一组操作的算法骨架,同时允许子类在某些步骤中替换具体行为。而回调则是通过将一个函数作为参数传递给另一个函数,使得被调用的函数可以在适当的时候调用这个传入的函数。 ...

    spring、ioc、aop、callback

    回调是一种设计模式,当某个操作完成后,系统会调用预先注册的回调函数,以通知用户或其他组件。在 Spring 中,回调机制常用于处理事件或者在生命周期中执行特定任务,如 Bean 的初始化和销毁。开发者可以通过实现...

    java自定义回调函数

    回调函数允许一个方法在完成特定操作后通知另一个方法,这种设计模式在异步编程和事件处理中尤其常见。在Java中,我们可以使用接口或者匿名内部类来实现回调机制。 首先,我们需要理解什么是回调。回调是一种编程...

    Spring源代码解析(三):Spring_JDBC.doc

    这些方法通常会接受一个回调函数,即Callback接口的实现。用户在回调接口的实现中编写与数据库交互的具体逻辑,例如指定SQL语句。例如,以下代码展示了如何使用JdbcTemplate执行一个自定义的操作: ```java ...

    Spring JdbcTemplate api

    在`JdbcTemplate`的设计中,模板(Template)承担着事物控制、资源管理和异常处理的责任,而回调(Callback)则专注于实现应用程序特有的逻辑,如创建SQL语句、设置参数和处理结果集。这种分离使得开发者能够更专注...

    Spring源代码解析3:SpringJDBC[归纳].pdf

    `JdbcTemplate`遵循模板方法设计模式,通过回调函数(Callback)机制,允许用户在特定的接口中实现自定义的行为。例如,`JdbcTemplate`提供了一个`ConnectionCallback`接口,用户可以实现这个接口的`doInConnection...

    Spring+JMS+消息处理

    - **Session Callback(会话回调)**:另一个回调接口,用于处理更复杂的JMS操作,如事务管理等。 #### 三、Spring JMS配置示例 Spring JMS的配置通常是在Spring的XML配置文件中完成的。下面展示了一个简单的配置...

    Spring的DAO

    Spring的DAO设计模式主要体现在模板(Template)和回调(Callback)两个概念上。 模板类,如`JdbcTemplate`,负责处理数据访问流程中的通用部分,包括事务管理、资源的打开和关闭,以及异常的处理。这些模板类通常...

    说明Java的传递与回调机制的代码示例分享

    回调机制是Java编程中常见的一种设计模式,尤其在Spring框架中广泛运用。回调机制允许一个对象在被调用时反过来调用调用者的方法。简单来说,就是“如果你调用我,我也会调用你”。这种机制通常通过接口实现,接口...

    CGLib代理模式用到的jar包

    3. Callback:这是一个回调接口,CGLib使用它来调用用户定义的拦截器。在创建代理对象时,可以设置多个Callback,这些Callback会在代理对象的方法调用时按顺序执行。 4. cglib.jar:这是CGLib的主要依赖库,包含了...

    代理模式所需的jar包—cglib.rar

    首先,你需要设置Enhancer的回调(Callback),通常是MethodInterceptor接口的实例。然后,通过调用Enhancer的`create()`方法,就可以生成代理对象。 ```java Enhancer enhancer = new Enhancer(); enhancer....

    A类B类互相调用

    在编程领域,A类与B类互相调用是一种常见的设计模式,它反映了对象之间的交互关系。这种模式在很多实际场景中都有应用,如模块间的通信、业务逻辑的处理等。本篇文章将深入探讨A类B类互相调用的实现方式、可能遇到的...

    基于java的上商城设计与实现.docx

    - 指定实际使用的回调函数名,如`jsonpCallback: 'ABC'`。 - 服务器端使用Spring提供的`MappingJacksonValue`来设置响应头和响应内容类型。 ```java @RequestMapping(value = "application/json;charset=UTF-8") @...

    cglib代理jar包

    在Java编程中,代理模式是一种常用的设计模式,它能让我们在不修改原有对象的基础上,通过代理对象来增强原有对象的功能。静态代理虽然直观,但存在局限性,如代理类必须与原类实现相同的接口,这限制了其灵活性。而...

    SpringBoot异步

    使用`@Async`注解的方法完成后,可以通过`@Async`注解的另一个方法作为回调,或者使用CompletableFuture的thenApply、thenAccept等方法进行链式操作。 7. **调试与测试** 在开发和测试过程中,可以通过`@...

    java接口用法

    综上所述,接口在Java中扮演着至关重要的角色,它不仅是实现多态性的基石,也是设计模式和框架中不可或缺的一部分。通过理解和熟练掌握接口的使用,开发者可以编写出更加灵活、可扩展和易于维护的代码。

    jdk与cglib动态度代理的区别原理

    在Java编程领域,动态代理是一种常见的设计模式,用于在运行时创建对象的代理,以便在调用实际目标方法之前或之后插入额外的行为。主要存在两种常见的动态代理技术:JDK动态代理和CGLIB(Code Generation Library)...

    cglib-Root_RELEASE_2_2_3.zip

    5. **代理类的创建**:使用`Enhancer.create()`方法,传入需要代理的类和回调接口,即可生成一个代理对象。 6. **性能优化**:CGlib生成的代理类比Java反射API更快,因为它避免了反射的开销,直接调用方法的字节码...

    基于MAVEN项目的CGLib动态代理原理及实现

    在Java编程领域,动态代理是一种常见的设计模式,它允许我们在运行时创建代理对象来扩展或增强已有对象的功能。本文将深入探讨如何在基于Maven的项目中利用CGLib库实现动态代理。CGLib(Code Generation Library)是...

Global site tag (gtag.js) - Google Analytics