阅读spring5源码DefaultSingletonBeanRegistry类遇到问题
发现SpringBean中存在大量回调机制和aware接口,于是特意去了解"什么是回调"
传送门:https://blog.youkuaiyun.com/chenlixiao007/article/details/113881768
____________________________________________________
回调方式
1、同步调用
-
A.a()—>B.b()的过程中需要等待b()完成才能进行a()操作
-
如果b()耗时过长或陷入阻塞状态,a()方法无法继续,整个流程陷入阻塞状态
2、异步调用
-
为了解决同步调用可能出现的阻塞,A.a()—>new thread—>b.b()通过新建线程来完成调用,a()不受b()影响,代码直接往下执行
-
在特定情况下,必须通过一定的方式对b()的执行结果进行监听(在Java中, 可以使用Future+Callable的方式做到,地址https://www.cnblogs.com/xrq730/p/4872722.html)
3、回调
-
回调是一种双向的调用方式,分为同步回调和异步回调
-
其思想是 A.a()—>B.b(),b()执行完毕主动调用A.callback()
____________________________________________________
测试
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);//输出"调用b方法"->"开始回调"
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);//输出"调用b方法"->"开始回调"
}).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方法
开始回调