春天的@Value插入顺序不明确

时间:2015-03-06 08:55:17

标签: java spring spring-batch

我在春天有一个bean,我尝试从属性文件中注入一些值。

对我来说这不是一项不寻常的任务,我已多次这样做而没有错误,但现在,我有这段代码

@Component("cmHeaderChecker")
public class CustomerManagementHeaderChecker extends AbstractHeaderChecker {

private static Logger LOGGER = Logger.getLogger(CustomerManagementHeaderChecker.class);

protected String fileSeparator;

@Value("${customerManagement.file.input.separator}")
public void setFileSeparator(String separator) {
    LOGGER.error("set separator");
    this.fileSeparator = separator;
    super.setSeparator(separator);
}

@Value("${customerManagement.file.input.headers}")
public void setExpectedHeader(String expectedHeader) {
    LOGGER.error("set header");
    super.setExpectedHeader(expectedHeader.split(normalizeSplitter(fileSeparator)));
}

@javax.annotation.Resource(name = "cmReportGenerator")
public void setReportGenerator(ReportGenerator reportGenerator) {
    super.setReportGenerator(reportGenerator);
}
}

如果我在调试模式下运行此代码,则在fileSeparator之前设置expectedHeader,一切正常

如果我在运行模式下运行此代码,则fileSeparator之前未设置expectedHeader并且它会抛出空指针异常

我理解这一点有点麻烦。你能否提供一些关于这个的解释


如果我改变以下方法,它在运行和调试模式下均可以工作,但这仍然无法解释相当奇怪的行为。而我现在不太喜欢二传手

@Value("${customerManagement.file.input.separator}")
protected String fileSeparator;

@Value("${customerManagement.file.input.headers}")
public void setExpectedHeader(String expectedHeader) {
    LOGGER.error("set header");
    super.setSeparator(fileSeparator); 
   super.setExpectedHeader(expectedHeader.split(normalizeSplitter(fileSeparator)));
}

1 个答案:

答案 0 :(得分:3)

Java / Spring在此上下文中不保证订购方面的任何内容。因此,您不应该依赖于可预测的顺序。

最好的办法是从参数的设置者中删除所有逻辑(它们只应用于设置值)并将该逻辑放在@PostConstruct中。

保证PostConstruct在设置完所有参数值后运行。