java - Spring中是先创建bean还是先通过构造函数创建实例

标签 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?

最佳答案

构造函数将首先被调用,因此您的 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/

相关文章:

java - 以多种格式从 InputStream 中读取

java - 使用扫描仪输入的字符串到整数的转换

java - Spring Autowiring map 行为

java - 使用 android 捕获任意按钮的点击

java - 从已绑定(bind)到数据库表的组合框中检索文本

java - 是否有 Lombok 方法来初始化从其他字段计算的最终字段?

java - Spring ajax 调用上的 400 错误请求

xml - tomcat7-maven-plugin log4j : no appender could be found for logger (org. apache.catalina.startup.Catalina)

java - 在 Spring Boot 中处理 */* 内容类型

java - Redis 集群与 Spring Boot 集成