作者:梅焱my | 来源:互联网 | 2023-10-17 20:25
阅读spring5源码DefaultSingletonBeanRegistry类遇到问题发现SpringBean中存在大量回调机制和aware接口,于是特意去了解
阅读spring5源码DefaultSingletonBeanRegistry类遇到问题
发现SpringBean中存在大量回调机制和aware接口,于是特意去了解"什么是回调"
传送门:https://blog.csdn.net/chenlixiao007/article/details/113881768
____________________________________________________
回调方式
1、同步调用
2、异步调用
-
为了解决同步调用可能出现的阻塞,A.a()—>new thread—>b.b()通过新建线程来完成调用,a()不受b()影响,代码直接往下执行
-
在特定情况下,必须通过一定的方式对b()的执行结果进行监听(在Java中, 可以使用Future+Callable的方式做到,地址https://www.cnblogs.com/xrq730/p/4872722.html)
3、回调
____________________________________________________
测试
1、同步回调
public class SynCallBack {interface Callback{void callback();}static class A implements Callback{private B b=new B();void a(){System.out.println("调用a方法");b.b(this);System.out.println("a方法完成");}public void callback(){System.out.println("开始回调");}}static class B{void b(Callback callback){System.out.println("调用b方法");callback.callback();}}public static void main(String[] args) {new A().a();}
}
打印结果:
调用a方法
调用b方法
开始回调
a方法完成
结果显示正常
类A.a方法执行过程中,等待类B.b方法执行完毕,才继续往下执行代码
2、同步回调
public class NoSynCallBack {interface Callback{void callback();}static class A implements Callback {private B b=new B();void a(){System.out.println("调用a方法");new Thread(() -> {b.b(this);}).start();System.out.println("a方法完成");}public void callback(){System.out.println("开始回调");}}static class B{void b(Callback callback){System.out.println("调用b方法");callback.callback();}}public static void main(String[] args) {new A().a();}
}
打印结果:
调用a方法
a方法完成
调用b方法
开始回调
结果没有按同步逻辑进行
类A.a方法执行过程中,不受类B.b方法影响,继续往下执行代码
____________________________________________________
综上
1、回调方式不同,执行结果不一样
2、同步回调是串行发生堵塞,异步回调则是并行不受影响