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

标签 java spring spring-mvc

我对 Spring 比较陌生,并且正在学习一些示例。
在其中一个示例中,我注意到 Spring 没有将 URI 映射到方法。
我发现我将 @ComponentScan 注释放在错误的配置类上并解决了我的问题。
所以我的问题是为什么@ComponentScan 适用于这些类之一,而不适用于另一个?


@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};
    }
我读过根配置类和 servlet 类在应用程序上下文层次结构中的设置不同。
我怀疑这与此有关,但我看不出这将如何导致这种情况。

最佳答案

Javadoc AbstractAnnotationConfigDispatcherServletInitializer建议实现:
getRootConfigClasses() -- 用于“根”应用程序上下文(非 Web 基础架构)配置。
getServletConfigClasses() -- 用于 DispatcherServlet 应用程序上下文(Spring MVC 基础设施)配置。
如果不需要应用程序上下文层次结构,应用程序可以通过 getRootConfigClasses() 返回所有配置
因此,如果 ServletConfig 级别上没有重复,则 RootConfig 上的 @ComponentScan 应该可以工作。
你能发布你得到的错误和所有类吗?
我建议您将 RootConfig 放在包的根目录中,并在不指定基础包的情况下使用 @ComponentScan。

关于java - 为什么@ComponentScan 对于不同的配置文件表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68994079/

相关文章:

java - AWT 按钮在 VLCJ 中不可点击

spring boot 未连接到 AWS 中的 RabbitMQ

java - 如何在 Spring MVC 中向 JSP 发送参数并获取更新的参数

spring - 在 Maven Pom 中指定替代 Spring application.properties

java - Spring 3 为整个应用程序注册一次属性编辑器

hibernate - org.hibernate.HibernateException : Could not obtain transaction-synchronized Session for current thread

java - Spring MVC 从带有 @Scheduled 注释的 Cron 方法访问服务类

java - 如何使用 Bouncy CaSTLe 从 CMS 中删除签名?

java - 使用 getServletConfig().getServletContext().getAttribute() (Java) 时获取 NPE

java - 如何在单个事务中最好地加载多个数据库条目?