gpt4 book ai didi

java - Spring在嵌套类中注入(inject)bean null

转载 作者:搜寻专家 更新时间:2023-11-01 03:31:38 25 4
gpt4 key购买 nike

我有一个包含 2 个静态嵌套类的类,它们对 2 个不同的泛型类型执行相同的操作。

我将这 2 个类作为 bean 公开,并像往常一样为构造函数添加 @Autowired。

这是基本设置

abstract class <T> Parent implements MyInterface<T> {
private final Service service;
Parent(Service service){ this.service = service; }

@Override public final void doInterfaceThing(T thing){
T correctedT = map(thing);
service.doTheThing(correctedT);
}

protected abstract T map(T t);

@Service
public static class ImplA extends Parent<A> {
@Autowired ImplA (Service service){ super(service); }
A map(A a){ //map a }
}

@Service
public static class ImplB extends Parent<B> {
@Autowired ImplB (Service service){ super(service); }
B map(B b){ //map b }
}

}

我在另一个类(class)

@Service
public class Doer {
private final List<MyInterface<A>> aImpls;
@Autowired public Doer(List<MyInterface<A>> aImpls){ this.aImpls = aImpls; }
public void doImportantThingWithA(A a){
aImpls.get(0).doInterfaceThing(a);
}
}

当我运行该应用程序时,一切似乎都已正确注入(inject),并且当我在 ImplA 和 ImplB 构造函数中放置断点时,我为“服务”设置了一个非空值。我在 Doer 的 aImpls 列表中也有一个 ImplA bean。

然而,当我调用 doImportantThingWithA(a) 时,ImplA 中的“服务”为空,我显然死了。

我不确定这是怎么可能的,因为:

  1. 我在服务的构造函数中看到一个非空值,它是一个 final 字段。
  2. 如果 spring 将 ImplA 和 ImplB 注入(inject)到另一个类中,它应该已经将服务注入(inject)到 ImplA 或 ImplB 中,或者在 bean 初始化时抛出异常。我没有设置延迟加载,所有 bean 依赖项都是必需的。

嵌套类的原因是因为两个实现之间唯一不同的是 map() 函数。尽量避免为 1 行不同的代码添加额外的类。

更多信息:当我在 Parent.doInterfaceThing() 中添加一个断点时,如果我在“服务”上添加一个监视,我将获得 null 作为值。如果我添加一个 getService() 方法,然后调用 getService() 而不是直接引用 this.service,我将获得正确的服务 bean。我不知道这意味着什么,但代理似乎有些奇怪。

最佳答案

看起来问题的原因是 Parent.doInterfaceThing();

如果我从方法签名中删除 final,“服务”字段会正确填充并且代码会按预期工作。

我完全不明白为什么更改方法签名会影响我类中 final 字段的注入(inject)值...但现在可以了。

关于java - Spring在嵌套类中注入(inject)bean null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51031534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com