我的内部@Autowired有问题。我发布了简化的代码结构。我有两个用@Configuration注释的类和两个简单的bean。在D类中,自动装配的bean不会注入。所以我想知道在不改变结构的情况下解决NPE是否可行?
A类:
@Configuration
public class A {
@Autowired
private B b;
@Bean
publict Other other() {
b.doFoo();
Other other = new Other();
}
@Bean
public C c() {
return new C();
}
}
B组:
@Configuration
public class B {
@Bean
public D d() {
return new D();
}
public void doFoo() {
d().doBar();
}
}
C类内部结构无关紧要。所以D级:
public class D {
@Autowired
C c;
public void doBar() {
c.doFooBar(); // And here we got NPE
}
}
我必须注意到,如果我将bean D的初始化从B移动到A并将其自动装配到B,一切正常:
@Configuration
public class A {
@Autowired
private B b;
@Bean
publict Other other() {
b.doFoo();
Other other = new Other()
}
@Bean
public C c() {
return new C();
}
@Bean
public D d() {
return new D();
}
}
@Configuration
public class B {
@Autowired
private D d;
public void doFoo() {
d.doBar();
}
}
但这种方法并不合适。
答案 0 :(得分:0)
D类也应该用@Component或类似的东西注释。只有春豆很容易自动装配。
答案 1 :(得分:0)
让我们分析第B
课。在该类中,当您调用doFoo()
方法时,您已执行d().doBar();
,这就像您手动创建类D
的实例一样,没有任何Spring。您直接调用d()
方法,就像您推送new D().doBar()
一样。如果您想使用spring创建D
,请在课程B
中添加此内容:
@Autowired
private D d;
并将您的方法doFoo()
更改为:
d.doBar();
你问题的关键部分是:
并将其自动连接到B一切正常
这也是一个答案。