Spring bean在扩展的类中为null



我已经用很多方法搜索了它,但找不到任何相关的东西。我遇到了一个问题,在另一个bean(扩展的(中没有springbean是自动连接的。

我有这个:

interface A {
}
@Service
class B implements A {
@Autowired
private RandomSpringBean randomSpringBean;
}
@Primary
@Service
class C extends B {

}

现在发生的情况是,当B内部的RandomSpringBean被另一个自动连接B的类调用时,它并没有被自动连接,而是只被自动连接C的类调用,比如

class D {
@Autowired
private B b;//beans inside B are null
}
class E {
@Autowired
private C c;//beans inside B (C subclass) are not null
}

D和E都是在其他类中自动连接的。如果我注释掉/删除C,B将恢复正常工作。

我希望这不会太令人困惑。

Ps:我不是这样做的,是别人干的。我只是有这个问题,想知道一种方法来解决它,也许不会让C停止扩展B.

如果您没有使用@Qualifier/@Primary或类似的结构,这部分代码应该会给您带来问题:

class D {
@Autowired
private B b;
}

例外情况如下:

Field b in my.boring.package.beandemo.D required a single bean, but 2 were found:

这是一个工作演示:

import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
@Configuration
public class MyBeans {

@Component
public static class RandomBean {}

public static interface A {}

@Component("B")
public static class B implements A {

@Autowired
RandomBean randomBean;
}

@Component
public static class C extends B {}

@Component
public static class D {

@Autowired
@Qualifier("B")
private B b;

@PostConstruct
public void checkRandomBean() {
if (b.randomBean != null) {
System.out.println("B has randomBean");
}
}
}

@Component
public static class E {

@Autowired
private C c;

@PostConstruct
public void checkRandomBean() {
if (c.randomBean != null) {
System.out.println("C has randomBean");
}
}
}
}

编辑:

请检查D.中B的运行时类

由于C是用@Primary注释的,因此应该将C的实例注入D.

此外,C将无法访问B.的私人字段

最新更新