【发布时间】:2021-03-10 05:49:49
【问题描述】:
我在运行时遇到问题。 我有下面的spring bean定义,当我启动Tomcat服务器时,“student”被加载但子bean“address” 属性没有被注入(我相信基本上找不到“地址”bean),它的值将始终为空,这就是为什么在运行时抛出 NPE。 但是,如果我对“地址”属性使用 @Autowired 注释而不是在 XML 中添加它,它总是可以工作的。
如果我不使用@Autowired,你能告诉我为什么在运行时找不到“地址”吗?解决办法是什么,这样容器才能找到那个bean 在加载“学生”之前?
注意:以下定义在 2 个不同的 XML 中。此外,我在启动期间使用详细记录了类名,并且在这两种情况下都看到了(有和没有@Autowired) “com.test.Address”类正在加载,这就是为什么我认为在 @Autowired 的情况下,容器能够通过检查类型来加载该对象
<bean id="student" class="com.test.Student">
<property name="address" ref="address" />
</bean>
<bean id="address" class="com.test.Address">
<property name="street" value="Street1" />
<property name="state" value="State1" />
<property name="country" value="Country1" />
</bean>
类定义:
public class Student {
private Address address;
public setAddress(Address address) {
this.address = address;
}
}
public class Address {
private String street;
private String state;
private String country;
public setStreet(String street) {
this.street = street;
}
public setState(String state) {
this.state = state;
}
public setCountry(String country) {
this.country = country;
}
}
谢谢
【问题讨论】:
-
能否提供
com.test.Address和com.test.Student的源码? -
@MarkBramnik 添加了类定义
-
如何加载应用程序上下文?如果你使用
ClassPathXmlApplicationContext,它会从xml加载,如果你使用AnnotationConfigApplicationContext或ConfigurableApplicationContext,你可以使用@Autowired。
标签: java spring dependency-injection