java - Spring在嵌套类中注入bean null
问题描述
我有一个包含 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 }
}
}
在另一堂课上,我有
@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);
}
}
当我运行应用程序时,一切似乎都被正确注入了,当我在 ImplA 和 ImplB 构造函数中放置一个断点时,我有一个“服务”的非空值。我在 Doer 的 aImpls 列表中也有一个 ImplA bean。
但是,当我调用 doImportantThingWithA(a) 时,“服务”在 ImplA 中为空,我显然死了。
我不确定这是怎么可能的,因为:
- 我在服务的构造函数中看到了一个非空值,它是一个最终字段。
- 如果 spring 将 ImplA 和 ImplB 注入到另一个类中,它应该已经将 Service 注入到 ImplA 或 ImplB 中,或者在 bean 初始化时抛出了异常。我没有设置延迟加载,并且需要所有 bean 依赖项。
嵌套类的原因是因为在 2 个实现之间唯一改变的是 map() 函数。试图避免为 1 行不同的代码添加额外的类。
更多信息: 当我在 Parent.doInterfaceThing() 中添加断点时,如果我在“服务”上添加一个监视,我会得到 null 作为值。如果我添加一个 getService() 方法,然后调用 getService() 而不是直接引用 this.service,我会得到正确的服务 bean。我不知道这意味着什么,但代理似乎有些奇怪。
解决方案
看起来导致问题的原因是 Parent.doInterfaceThing();
如果我从方法签名中删除 final,“服务”字段将正确填充,并且代码按预期工作。
我完全不明白为什么更改方法签名会影响我类中最终字段的注入值......但它现在可以工作了。
推荐阅读
- javascript - 我该如何延迟javascript执行?
- codenameone - 代号一个事件侦听器,用于再次在前台重新启动应用程序?
- sql - 将值设置为常量时应该添加 WHERE 吗?
- powershell - 如何使用 Powershell 向本地 Outlook 联系人添加证书?
- android - 匕首与包裹发生冲突
- python-3.x - 如何将python列表中的重复项变为零
- javascript - 通过 express 处理 jwt 令牌返回错误“const token = req.cookies.auth; [0] ^ [0] [0] ReferenceError: req is not defined”
- git - 如何在没有结帐的情况下获取另一个分支中的文件列表
- haskell - 如何解决此异常:threadWait:无效参数(错误文件描述符)执行 [haskell]?
- python - 在 python 中停止 bash 脚本