@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?
最佳答案
构造函数将首先被调用,因此您的 stringMatchBasedEval
此时将为 null。这个问题非常普遍,并且有一个非常通用的解决方案。一般来说,你的构造函数应该是空的,你的初始化逻辑应该移动到单独的方法中(通常称为init()
),用@PostConstruct
注释标记该方法,Spring将调用它紧接着构造函数和所有注入(inject)完成之后。因此,您的 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());
}
}
关于java - Spring中是先创建bean还是先通过构造函数创建实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42137787/