@Autowired
@Qualifier("stringMatchedBasedAnswerSuggestion")
private SuggestionEvaluator stringMatchBasedEval;
private List<SuggestionEvaluator> listEvaluators;
public AnswerSuggestionServiceImpl() {
if (listEvaluators == null) {
listEvaluators = new ArrayList<SuggestionEvaluator>();
// All the additional objects to be added.
listEvaluators.add(stringMatchBasedEval);
Collections.sort(listEvaluators, SuggestionEvaluator.compareByPriority());
}
}
在这种情况下,构造函数内部的代码将首先执行,否则将创建bean。 stringMatchBasedEval是否为null?
答案 0 :(得分:3)
将首先调用构造函数,因此您的stringMatchBasedEval
当时将为null。问题非常普遍,有一个非常普遍的解决方案。一般来说,你的构造函数应该是空的,你的初始化逻辑应该移动到单独的方法(通常称为init()
)标记带有@PostConstruct
注释的方法,Spring将在构造函数和所有注入完成后立即调用它。因此,您的stringMatchBasedEval
已经初始化。
@Autowired
@Qualifier("stringMatchedBasedAnswerSuggestion")
private SuggestionEvaluator stringMatchBasedEval;
private List<SuggestionEvaluator> listEvaluators;
public AnswerSuggestionServiceImpl() {
}
@PostConstruct
private void init() {
if (listEvaluators == null) {
listEvaluators = new ArrayList<SuggestionEvaluator>();
// All the additional objects to be added.
listEvaluators.add(stringMatchBasedEval);
Collections.sort(listEvaluators, SuggestionEvaluator.compareByPriority());
}
}
答案 1 :(得分:2)
在注入方法中,为了注入bean,您必须拥有已经创建的注入对象。在此之后,您必须设置其bean。我认为很明显,首先创建对象,然后注入bean。
因此,首先执行构造函数,然后注入bean。
答案 2 :(得分:1)
要将某些东西注入对象,spring应该首先创建对象。
您可以为您的案例使用基于构造函数的注入:
@Autowired
public AnswerSuggestionServiceImpl(@Qualifier("stringMatchedBasedAnswerSuggestion") SuggestionEvaluator stringMatchBasedEval) {
if (listEvaluators == null) {
listEvaluators = new ArrayList<SuggestionEvaluator>();
// All the additional objects to be added.
listEvaluators.add(stringMatchBasedEval);
Collections.sort(listEvaluators, SuggestionEvaluator.compareByPriority());
}
}