(1)报错简述
①原写法:
在BSocketServer中存在:
ASocketServer aSocketServer = new ASocketServer();
在ASocketServer中存在:
BSocketServer bSocketServer = new BSocketServer();
②报错信息:
Caused by: java.lang.StackOverflowError: null
at org.ldd.test.config.ASocketServer.<init>(ASocketServer.java:22)
at org.ldd.test.config.BSocketServer.<init>(BSocketServer.java:12)
at org.ldd.test.config.ASocketServer.<init>(ASocketServer.java:22)
at org.ldd.test.config.BSocketServer.<init>(BSocketServer.java:12)
at org.ldd.test.config.ASocketServer.<init>(ASocketServer.java:22)
at org.ldd.test.config.BSocketServer.<init>(BSocketServer.java:12)
(2)原因
根据堆栈跟踪信息,可以看到代码发生了 StackOverflowError 错误。发生该错误的原因是方法的递归调用导致的无限循环。 在 ASocketServer 的构造函数内部又创建了 BSocketServer 对象,而 BSocketServer 的构造函数内部又创建了 ASocketServer 对象,两者之间形成了相互递归的调用。
(3)解决方案
用 @Autowired 注解来管理 ASocketServer和 BSocketServer的创建和注入
①在 ASocketServer 和 BSocketServer 类的定义上添加 @Component 注解,将其标记为 Spring 组件。
②在需要使用 ASocketServer 对象的地方,声明一个 ASocketServer 类型的变量,并使用 @Autowired 注解进行标记。 例如:
@Autowired
private ASocketServer aSocketServer;
③在需要使用BSocketServer处同理,同时需要确定自己的项目中启用了组件扫描、配置了适当的 bean 和依赖关系。