我有这样的界面
public interface InterfaceA {
public String methodA();
}
我已经像这样实现了它
public class ClassA implements InterfaceA {
@Override
public String methodA(){
return "HELLO";
}
}
我正在尝试在另一个类
中引用此类的beanpublic class ClassB {
@Autowired
private InterfaceA mybean;
String str = mybean.methodA();
}
我有以下bean配置
<bean id="mybean" class="ClassA"></bean>
最有趣的一点是,如果我删除methodA
和InterfaceA
中ClassA
的所有声明和实现,然后尝试这个
public class ClassB {
@Autowired
private InterfaceA mybean;
}
没有显示错误。 在另一种情况下,当我尝试运行此应用程序时,会显示以下错误:“找不到依赖项类型[ClassA]的限定bean”
答案 0 :(得分:1)
这是因为bean和java类的livecyle!
在你的ClassB
中你有两个变量。在创建对象实例之后(春天),Spring将填充mybean
。但是一旦创建了对象实例,就会对String str = mybean.methodA();
进行处理。此时变量mybean
仍然为空,而实例创建将失败!
解决方案:使用@PostConstruct
,spring init-method或实施InitializingBean
- 有关概述,请参阅此answer
public class ClassB {
@Autowired
private InterfaceA mybean;
private String str;
void afterPropertiesSet() {
String str = mybean.methodA();
}
}