我有一个现有的弹簧(5.3.9)转换器。它是一个无状态转换器:没有成员,空的默认构造函数。使用此表单,它将被拾取并与我的系统很好地工作:
class Conv implements Converter<A, B> {
public B convert(A a) {
...
}
}当向此转换器添加状态时(对另一个bean的任何引用):
class Conv implements Converter<A, B> {
// the state
private final X x;
public Conv(X x) {
this.x = x;
}
public B convert(A a) {
...
}
}.问题:现在,在运行时中找不到转换器
无转换器可从A型转换为B型
转换器本身将被成功地创建,并且仍然被生命周期所捕获。依赖关系可以很好地注入,并且它存在(在构造函数中处于调试状态)。bean初始化过程中没有任何异常。我尝试过使用构造注入;@Autowired注入-我得到了同样的行为。
最后,在与一位同事讨论后,他建议在构造函数的论点中添加@Lazy:
class Conv implements Converter<A, B> {
// the state
private final X x;
public Conv(@Lazy X x) {
this.x = x;
}
public B convert(A a) {
...
}
}令人惊讶的是,它解决了问题!现在可以在添加状态之前找到并使用转换器。
(update:我无法创建一个最小的示例来重现这个问题。它可能与我真正的bean依赖关系有关。)
你能解释一下为什么@Lazy做了这个把戏吗?
发布于 2022-07-26 07:17:40
问题是,Converter需要在生命周期中的某个时间注册。向其添加依赖项改变了可以创建此转换器的位置。
现在,当添加@Lazy时,可以在正确的时间再次进行构造,因为现在只有在使用依赖项时才会使用/检测该依赖项。@Lazy将作为依赖项的代理,在使用时将执行ApplicationContext.getBean调用,而不是在构造对象时执行。
因此,基本上,它与在上下文生命周期中,如果可以使用或不使用对象,可以构造对象的位置有关。
https://stackoverflow.com/questions/73106411
复制相似问题