遇到一个很奇葩的问题,我的某类 A 作为 Bean 是通过自定义的 FactoryBean 的 getObject() 方法进行创建的。Spring 的默认行为是当调用该 Bean 时,如果 Bean 未载入才调用对应 Bean 的 FactoryBean 的 getObject()。而我的 getObject() 方法的本质是:从本地读 json 文件,而后进行反序列化,这个过程会默认调用类 A 的无参构造器。而我原本是打算在类 A 的无参构造器内通过 SpringContextHolder 来获取另一个 Bean B 的,手误写成了获取 Bean A,这样就导致:试图获取 A -> 发现 A 作为 Bean 未存在 -> 触发 FactoryBean.getObject() -> Json 反序列化 -> 调用 A 无参构造器 -> 构造器内试图获取 A -> 发现 A 作为 Bean 未存在...套娃了,直接栈溢出。这个问题 IDE 和 Spring 都没有任何反应,要不是我在反序列化时加了日志,我压根看不出来。
3737
DAYS111
POSTS395
REPLIES
Popular
Posts
Common
Tags
Recent
Replies
-
@ 写在建站十周年 6 天前
-
@ 写在建站十周年 6 天前
-
@ 写在建站十周年 6 天前
-
@ 写在建站十周年 6 天前
解决方法是:全局创建一个 ThreadLocal 包裹的 HashSet,该 HashSet 专用于 FactoryBean.getObject 方法。对于同一个类的注册,首次进入该方法时,将其置于 HashSet 中,初始化完成后移除。一旦进入该方法后发现正在初始化,则立刻抛出异常。