我正在通过 Spring MVC 工作,我有很多Formatter<T>
类,像这样
@Component
public class DeporteFormatter implements Formatter<Deporte> {
...
@Autowired
public DeporteFormatter(SomeDependency someDependency){
this.someDependency = someDependency;
}
我有我的定制MvcInfrastructureConfiguration
课程
@EnableWebMvc
@Configuration
@ComponentScan(basePackages={"..."})
public class MvcInfrastructureConfiguration extends WebMvcConfigurerAdapter {
private Set<Formatter<?>> formatters;
...
@Override
public void addFormatters(FormatterRegistry registry) {
if(formatters==null)
logger.error("dependency is null");
logger.info("formatters.size(): {}", formatters.size());
for(Formatter<?> formatter : formatters){
registry.addFormatter(formatter);
}
}
...
我对以下内容感到困惑:
如果我使用
//Mandatorily asked for by Spring
public MvcInfrastructureConfiguration(){
logger.info("MvcInfrastructureConfiguration Constructor...");
}
@Autowired
public MvcInfrastructureConfiguration(Set<Formatter<?>> formatters){
logger.info("MvcInfrastructureConfiguration Constructor with parameter");
this.formatters = formatters;
}
formatters
实例变量永远不会被注入,我得到一个 NullPointerException ..
但是如果我使用
@Autowired
private Set<Formatter<?>> formatters;
//Mandatorily asked for by Spring
public MvcInfrastructureConfiguration(){
logger.info("MvcInfrastructureConfiguration Constructor...");
}
//public MvcInfrastructureConfiguration(Set<Formatter<?>> formatters){
//logger.info("MvcInfrastructureConfiguration Constructor with parameter");
//this.formatters = formatters;
//}
一切正常。。
为什么?我认为@Autowired 应该不管他的位置如何都可以工作(当然,由于测试的问题,在非基础设施 bean 的实例变量中使用它是不好的做法)