为什么 @ComponentScan 对于不同的配置文件表现不同?

Why does @ComponentScan behave differently for different configuration files?

我是 Spring 的新手,正在学习一些示例。

在其中一个示例中,我注意到 Spring 没有将 URI 映射到方法。

我发现我将 @ComponentScan 注释放在了错误的配置上 class 并解决了我的问题。

所以我的问题是,为什么 @ComponentScan 适用于这些 class 之一而不适用于另一个?


@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"org.zerock.controller"}) // This Works.
public class ServletConfig implements WebMvcConfigurer {
    @Bean
    public MultipartResolver multipartResolver(){
        return new StandardServletMultipartResolver();
    }

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        registry.viewResolver(resolver);
    }


    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    }
}




@Configuration
//@ComponentScan(basePackages = {"org.zerock.controller"}) This Doesn't Work
public class RootConfig {
}



// How the two configuration classes are initialized
public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{RootConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{ServletConfig.class};
    }



我读过根配置 classes 和 servlet classes 在应用程序上下文层次结构中的设置不同。

我怀疑这与此有关,但我看不出这是怎么引起的。

AbstractAnnotationConfigDispatcherServletInitializer 的 Javadoc 建议实现:

getRootConfigClasses() -- 用于“根”应用程序上下文(非网络基础设施)配置。 getServletConfigClasses() -- 用于 DispatcherServlet 应用程序上下文(Spring MVC 基础结构)配置。

如果不需要应用程序上下文层次结构,应用程序可以 return 通过 getRootConfigClasses()

所有配置

因此,如果 ServletConfig 级别上没有重复,RootConfig 上的 @ComponentScan 应该可以工作。

你能post你得到的错误和所有类吗?

我建议您将 RootConfig 放在包的根目录中,并在不指定基础包的情况下使用 @ComponentScan。