- 回调函数的概念
回调函数顾名思义就是:A调用B,然后B又可以回调A中的方法。可以举如下例子:晚上下班回家开灯准备用电饭煲煮晚饭,发现家里由于欠费导致停电了,这个时候通过支付宝缴纳电费,电费缴纳成功之后呢支付宝需要通知电力公司,我家的电费缴纳成功了,然后我查看家里的电表,发现电费缴纳成功,可以继续做饭了(只是举例说明回调函数的含义,具体支付宝缴纳电费不一定是这么实现)。
- 样例代码
回调接口,电费缴纳成功之后需要通知客户端调用方,说电费缴纳成功了。
package com.test; /** * 回调接口 */ public interface ICallBackAction { void doOnLight(int number); }
具体缴纳费用的接口
/** * 缴纳费用的接口 */ public interface IPayFees { void executor(ICallBackAction action); }
缴纳电费的具体实现类,客户端调用此方法缴纳电费,缴纳成功之后需要回调客户端传入的回调函数的类对象实例中的方法,简称回调函数。
package com.test; /** * 缴纳电费的实现模板类 */ public class PayElectricityFeesTemplate implements IPayFees{ private int money ; public PayElectricityFeesTemplate(int money) { this.money = money; } @Override public void executor(ICallBackAction action) { System.out.println("缴纳电费" + money + "元"); System.out.println("0.5元一度电,共" + money * 2 + "度电, 充值成功"); action.doOnLight(money * 2); } }
测试类
package com.test; public class CallBackMain { public static void main(String[] args) { final CallBackMain main = new CallBackMain(); System.out.println("开始用电饭锅煮午饭.........."); System.out.println("发现家里断电了,发现是两个月没有充电费,欠费了.........."); System.out.println("开始充电费"); main.doBeginPayFee(100); } private void doBeginPayFee(int money) { IPayFees instance = new PayElectricityFeesTemplate(money); instance.executor(new ICallBackAction(){ //具体的回调函数,又被调用方在执行完具体逻辑之后调用此方法。还可以将被调用 //方法中的相关参数传递给调用方 @Override public void doOnLight(int number) { System.out.println("电费充值成功,来电了,共剩" + number + "度电"); } }); } }
- Spring中JdbcTemplate应用
JdbcTemplate.java为Spring中关于数据库操作的模板类,主要用于数据库操作的相关功能,例如获取
数据库的连接、超时处理等公共逻辑的模板类。
org.springframework.jdbc.core.JdbcTemplate.java /** * execute方法主要用于调用方需要执行数据库操作时的执行入口 * 此方法会统一获取数据库的底层连接,然后通过回调接口回传给调用方执行具体的数据库 * 操作。 * 这样做的好处是将获取数据库的连接操作统一封装到模板类中,调用方无需显示获取数据库 * 连接而是通过回调函数回传connection去操作数据库。这样代码即达到了复用,也达到有解耦 * 的效果,调用方只需要关心自己的执行业务即可。 */ @Override public <T> T execute(ConnectionCallback<T> action) throws DataAccessException { Assert.notNull(action, "Callback object must not be null"); Connection con = DataSourceUtils.getConnection(getDataSource()); try { Connection conToUse = con; if (this.nativeJdbcExtractor != null) { // Extract native JDBC Connection, castable to OracleConnection or the like. conToUse = this.nativeJdbcExtractor.getNativeConnection(con); } else { // Create close-suppressing Connection proxy, also preparing returned Statements. conToUse = createConnectionProxy(con); } return action.doInConnection(conToUse); } catch (SQLException ex) { // Release Connection early, to avoid potential connection pool deadlock // in the case when the exception translator hasn't been initialized yet. DataSourceUtils.releaseConnection(con, getDataSource()); con = null; throw getExceptionTranslator().translate("ConnectionCallback", getSql(action), ex); } finally { DataSourceUtils.releaseConnection(con, getDataSource()); } }
org.springframework.jdbc.core.simple.AbstractJdbcInsert.java /** * Delegate method to execute the insert, generating any number of keys. */ private KeyHolder executeInsertAndReturnKeyHolderInternal(final List<?> values) { ......... ......... else { getJdbcTemplate().execute(new ConnectionCallback<Object>() { /** * 注意参数conn对象,此对象为被调用方通过回调函数 * 传入的值,这样调用方只需要关心自己的数据库操作业务。 */ @Override public Object doInConnection(Connection con) throws SQLException, DataAccessException { // Do the insert PreparedStatement ps = null; try { ps = con.prepareStatement(getInsertString()); setParameterValues(ps, values, getInsertTypes()); ps.executeUpdate(); } finally { JdbcUtils.closeStatement(ps); } //Get the key Statement keyStmt = null; ResultSet rs = null; Map<String, Object> keys = new HashMap<String, Object>(1); try { keyStmt = con.createStatement(); rs = keyStmt.executeQuery(keyQuery); if (rs.next()) { long key = rs.getLong(1); keys.put(getGeneratedKeyNames()[0], key); keyHolder.getKeyList().add(keys); } } finally { JdbcUtils.closeResultSet(rs); JdbcUtils.closeStatement(keyStmt); } return null; } }); } return keyHolder; } return keyHolder; }
总结:
回调函数不只是有同步,也可以做到异步操作,这里就不举例说明,大体模式是一样的。
相关推荐
打开这个项目,你可以看到具体的代码实现,包括如何定义回调函数、如何在消息映射中声明、如何设置和调用回调,以及如何传递和处理用户数据。 通过以上步骤,你可以了解在MFC中实现回调函数的基本流程。回调函数在...
回调函数在C语言中是一种非常重要的编程机制,它允许我们将一个函数的地址作为参数传递给另一个函数,由这个函数在适当的时候调用我们传入的函数。这种模式在处理异步事件、信号处理、排序算法以及其他需要在特定...
接下来,我们将深入探讨C#中实现回调函数的原理、方式以及应用场景。 首先,我们需要理解什么是回调函数。回调函数本质上就是一个函数引用,可以在其他函数执行过程中或结束后被调用。在C#中,你可以通过几种方式来...
在C语言中一般用typedef来为回调函数定义别名(参数名)。 别名通过宏定义typedef来实现,不是简单的宏替换。可以用作同时声明指针型的多个对象。 比如: 代码如下:char *pa,pb;//pa是一个char型指针,但pb是一个...
在Delphi编程环境中,DLL(Dynamic Link Library)是一种可重用代码的库,它包含一组可...在实际开发中,回调函数常用于处理异步操作、事件通知、用户自定义行为等场景,因此对它的掌握对于Delphi开发者来说至关重要。
在C#编程中,回调函数是一种非常重要的设计模式,它允许我们传递一个方法作为参数到另一个方法中,以便在特定事件发生或者特定条件满足时执行。这种机制使得代码具有高度的灵活性和可扩展性,特别是在处理异步操作、...
总结来说,PB回调函数在多线程环境中的应用涉及到数据序列化、事件处理、线程安全以及组件化开发等多个方面。通过合理利用这些技术,可以构建高效、健壮的分布式系统或网络服务。而提供的"PBCallBack"资源则可以帮助...
在C++编程中,将类成员函数作为回调函数是一种常见的设计模式,特别是在处理异步操作、事件驱动编程或与库接口交互时。回调函数本质上是一个可以被其他代码调用的函数,它允许我们传递控制权给第三方代码并在特定...
在Java编程中,回调函数是一种设计模式,它允许一个对象在另一个对象执行特定操作后接收通知或进行处理。这种机制通常用于事件驱动编程或者异步编程中,使得代码能够响应某些特定事件的发生。在给定的场景中,我们...
#### 一、理解回调函数的特点及应用场景 在编程领域,回调函数是一种非常常见的设计模式,它允许程序员将一个函数作为参数传递给另一个函数,在适当的时候由后者来调用这个函数。这种机制在处理异步操作或事件驱动...
本篇将深入探讨“labview回调范例”,以及如何通过设置鼠标移动事件来触发回调函数,并利用引用更新主界面的控件。 首先,回调函数是当某个操作或事件发生时被调用的函数。在LabVIEW中,这种事件可以是按钮点击、...
如果DLL和客户端可能在不同的线程中运行,确保回调函数是线程安全的,或者使用适当的同步机制,如互斥量或临界区。 通过以上步骤,你可以实现VC++中的DLL回调函数。这个简单的实例展示了如何在DLL和客户端之间传递...
在OSG中,回调主要通过两种方式实现:继承自特定的类并重写虚函数,以及使用Observer模式。例如,`osgGA::GUIEventHandler`类提供了一个用于处理图形用户界面事件的接口,你可以创建一个子类并重写`handle()`函数以...
2. **DLL中的回调函数的应用**: 回调函数是DLL与调用程序交互的重要方式。它允许DLL传递控制权回调用者,让调用者执行特定的操作。在Delphi中,定义回调函数通常需要声明一个标准的Pascal函数类型,并将其作为参数...
本主题将详细探讨如何在C#应用程序中调用C++动态链接库(DLL)中的函数,并且在这个过程中,C#能够注册和处理C++库中定义的回调函数。 首先,让我们理解回调函数的概念。回调函数是一种设计模式,允许将一个函数的...
本篇文章将深入探讨回调函数的概念、用途,以及如何在VB中实现回调机制。 首先,让我们理解回调函数的基本概念。回调函数本质上是一个函数的引用,它被作为参数传递给另一个函数。当这个接收函数完成某些操作后,它...
为了便于理解和调试,博客文章应该详细介绍了如何在STM32项目中集成CANfestival库,如何配置回调函数,以及如何编写和测试这些回调。文件列表中只包含"02 回调函数",可能是指博客文章的章节名称或者示例代码的目录...
在编程领域,动态链接库(Dynamic Link ...这个例子展示了如何定义、设置和调用 DLL 中的回调函数,以及如何在主应用程序中使用这些功能。这种技术在许多实际场景中都非常有用,例如事件处理、插件系统和跨进程通信等。
回调机制是一种软件设计模式,它允许一个程序在执行过程中调用另一个程序提供的功能,并且这个被调用的函数会在特定事件发生时返回控制权给原始的调用者。回调机制通常用于异步处理、事件通知、功能扩展等多种场景。...
本文实例分析了C++中回调函数(CallBack)的用法。分享给大家供大家参考。具体分析如下: 如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。 其错误是普通的C++成员函数都隐含了一个传递...