0

我正在通过 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 的实例变量中使用它是不好的做法)

4

0 回答 0