一 回调模式(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 中,回调机制常用于处理事件或者在生命周期中执行特定任务,如 Bean 的初始化和销毁。开发者可以通过实现...
回调函数允许一个方法在完成特定操作后通知另一个方法,这种设计模式在异步编程和事件处理中尤其常见。在Java中,我们可以使用接口或者匿名内部类来实现回调机制。 首先,我们需要理解什么是回调。回调是一种编程...
这些方法通常会接受一个回调函数,即Callback接口的实现。用户在回调接口的实现中编写与数据库交互的具体逻辑,例如指定SQL语句。例如,以下代码展示了如何使用JdbcTemplate执行一个自定义的操作: ```java ...
在`JdbcTemplate`的设计中,模板(Template)承担着事物控制、资源管理和异常处理的责任,而回调(Callback)则专注于实现应用程序特有的逻辑,如创建SQL语句、设置参数和处理结果集。这种分离使得开发者能够更专注...
`JdbcTemplate`遵循模板方法设计模式,通过回调函数(Callback)机制,允许用户在特定的接口中实现自定义的行为。例如,`JdbcTemplate`提供了一个`ConnectionCallback`接口,用户可以实现这个接口的`doInConnection...
- **Session Callback(会话回调)**:另一个回调接口,用于处理更复杂的JMS操作,如事务管理等。 #### 三、Spring JMS配置示例 Spring JMS的配置通常是在Spring的XML配置文件中完成的。下面展示了一个简单的配置...
Spring的DAO设计模式主要体现在模板(Template)和回调(Callback)两个概念上。 模板类,如`JdbcTemplate`,负责处理数据访问流程中的通用部分,包括事务管理、资源的打开和关闭,以及异常的处理。这些模板类通常...
回调机制是Java编程中常见的一种设计模式,尤其在Spring框架中广泛运用。回调机制允许一个对象在被调用时反过来调用调用者的方法。简单来说,就是“如果你调用我,我也会调用你”。这种机制通常通过接口实现,接口...
3. Callback:这是一个回调接口,CGLib使用它来调用用户定义的拦截器。在创建代理对象时,可以设置多个Callback,这些Callback会在代理对象的方法调用时按顺序执行。 4. cglib.jar:这是CGLib的主要依赖库,包含了...
首先,你需要设置Enhancer的回调(Callback),通常是MethodInterceptor接口的实例。然后,通过调用Enhancer的`create()`方法,就可以生成代理对象。 ```java Enhancer enhancer = new Enhancer(); enhancer....
在编程领域,A类与B类互相调用是一种常见的设计模式,它反映了对象之间的交互关系。这种模式在很多实际场景中都有应用,如模块间的通信、业务逻辑的处理等。本篇文章将深入探讨A类B类互相调用的实现方式、可能遇到的...
- 指定实际使用的回调函数名,如`jsonpCallback: 'ABC'`。 - 服务器端使用Spring提供的`MappingJacksonValue`来设置响应头和响应内容类型。 ```java @RequestMapping(value = "application/json;charset=UTF-8") @...
在Java编程中,代理模式是一种常用的设计模式,它能让我们在不修改原有对象的基础上,通过代理对象来增强原有对象的功能。静态代理虽然直观,但存在局限性,如代理类必须与原类实现相同的接口,这限制了其灵活性。而...
使用`@Async`注解的方法完成后,可以通过`@Async`注解的另一个方法作为回调,或者使用CompletableFuture的thenApply、thenAccept等方法进行链式操作。 7. **调试与测试** 在开发和测试过程中,可以通过`@...
综上所述,接口在Java中扮演着至关重要的角色,它不仅是实现多态性的基石,也是设计模式和框架中不可或缺的一部分。通过理解和熟练掌握接口的使用,开发者可以编写出更加灵活、可扩展和易于维护的代码。
在Java编程领域,动态代理是一种常见的设计模式,用于在运行时创建对象的代理,以便在调用实际目标方法之前或之后插入额外的行为。主要存在两种常见的动态代理技术:JDK动态代理和CGLIB(Code Generation Library)...
5. **代理类的创建**:使用`Enhancer.create()`方法,传入需要代理的类和回调接口,即可生成一个代理对象。 6. **性能优化**:CGlib生成的代理类比Java反射API更快,因为它避免了反射的开销,直接调用方法的字节码...
在Java编程领域,动态代理是一种常见的设计模式,它允许我们在运行时创建代理对象来扩展或增强已有对象的功能。本文将深入探讨如何在基于Maven的项目中利用CGLib库实现动态代理。CGLib(Code Generation Library)是...