作者:梅焱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、同步回调是串行发生堵塞,异步回调则是并行不受影响