在Spring中,首先创建bean,或者首先通过Constructor创建Instance

时间:2017-02-09 13:17:00

标签: java spring

@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?

3 个答案:

答案 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());

    }
}