gpt4 book ai didi

java - spring 中@Value 的插入顺序不明确

转载 作者:行者123 更新时间:2023-11-29 05:10:06 24 4
gpt4 key购买 nike

我在 spring 中有一个 bean,我尝试从属性文件中注入(inject)一些值。

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

@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);
}
}

如果我在 Debug模式下运行这段代码,fileSeparator 设置在 expectedHeader 之前,一切正常

如果我在运行模式下运行这段代码,fileSeparator 不会在 expectedHeader 之前设置,它会抛出一个空指针异常

我有点难以理解这一点。你能解释一下吗


如果我更改以下方法,无论哪种方式,它都可以在运行和 Debug模式下工作,但这仍然不能解释非常奇怪的行为。而且我现在不太喜欢二传手

@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)));
}

最佳答案

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

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

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

关于java - spring 中@Value 的插入顺序不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28895251/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com