回调 Callback

2025/04/10

一、什么是回调?

如上图所示

  1. client 端调用 server 端
  2. 在特定条件满足时,又由 server 端反向调用 client 端

25.07.08 Tue

补:前几天看电影迷失东京,斯嘉丽和她在美国的朋友打电话结束的时候说“call me back”,我想着这不也是回调嘛,你调用的模块,在某个条件来临时会来调用你。

二、回调使用的场景

观察者模式

  1. 观察者实现回调接口
  2. 被观察者状态发生变更时触发回调,观察者们接收对应的状态变更消息

三、好处

  1. 调用方和被调用方分离,只通过接口进行交互
  2. 被调用方可以定义逻辑顺序,不管具体实现,只需要在约定的时机触发回调
  3. 至于接口方法逻辑如何被实现,由调用方自由进行控制

四、代码例子

接口定义

/**
 * @description 回调接口
 */
public interface Callback {
    void callbackMethod(String message);
}

调用方实现接口

/**
 * @description 调用方
 */
public class Client implements Callback {
    @Override
    public void callbackMethod(String message) {
        System.out.println("client 执行回调方法:" + message);
    }
}

传递对象、触发回调

/**
 * @description 被调用方
 */
public class Server {
    private Callback callback;

    /**
     * 注册 callback
     * @param callback
     */
    public void registCallback(Callback callback) {
        this.callback = callback;
    }

    /**
     * 调用 callback
     */
    public void triggerCallback() {
        System.out.println("server 触发 callback!");
        if (callback != null) {
            callback.callbackMethod("事件已经触发到了!");
        }
    }
}

验证执行

/**
 * @description 验证
 */
public class CallbackDemo {
    public static void main(String[] args) {
        Server server = new Server();
        Callback client = new Client();
        server.registCallback(client); // 直接传递接口

        server.triggerCallback();
    }
}

运行结果

五、使用步骤

  1. 接口定义:接口中定义回调的方法
  2. 实现接口:client 实现接口,并且实现回调方法
  3. 传递对象:将 client 传递给 server
  4. 触发回调:server 在适当时机去调用回调方法,执行回调逻辑

六、在 spring 中使用的回调

回调是 IoC 的具体实现手段之一,强调“框架调用用户代码”。

例如开发者实现框架的 Aware 接口,这些自定义的实现会在容器初始化阶段由框架进行调用,向开发者的 bean 中注入对应依赖 (例如 ApplictionContext/BeanFactory)。

七、new Thread(new RunnableImpl()).start()

根据前面的一些概念,new Thread(new RunnableImpl()).start()也是一种回调。

八、设置空调在早上 7:30 准时关闭

早上要关空调,但是不想从床上起来到桌子上拿遥控器去关,看到遥控器上有一个按钮【定时关闭】 我就设置在 7:30 定时关闭。

这个问了下 deepseek,并不是回调,算是时间驱动的定时任务了。