spring 中的 @Value 插入顺序不明确
Order of @Value insertion in spring is ambiguous
我在 spring 中有一个 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)));
}
Java/Spring 不保证在此上下文中的顺序。因此,您不应依赖可预测的顺序。
最好的办法是从参数的设置器中删除所有逻辑(它们应该只用于设置值)并将该逻辑放在@PostConstruct 中。
在设置所有参数值后,PostConstruct 保证运行。
我在 spring 中有一个 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)));
}
Java/Spring 不保证在此上下文中的顺序。因此,您不应依赖可预测的顺序。
最好的办法是从参数的设置器中删除所有逻辑(它们应该只用于设置值)并将该逻辑放在@PostConstruct 中。
在设置所有参数值后,PostConstruct 保证运行。