我已经用很多方法搜索了它,但找不到任何相关的东西。我遇到了一个问题,在另一个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.的私人字段