【问题标题】:How to understand Spring @ComponentScan如何理解 Spring @ComponentScan
【发布时间】:2015-03-10 12:23:13
【问题描述】:

我正在关注有关 Spring MVC 的教程,即使在阅读了 Spring API 文档之后,我也无法理解有关 @ComponentScan 注释的内容,所以这里是示例代码:

配置视图控制器

package com.apress.prospringmvc.bookstore.web.config;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
// Other imports ommitted
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "com.apress.prospringmvc.bookstore.web" })
public class WebMvcContextConfiguration extends WebMvcConfigurerAdapter {
    // Other methods ommitted
    @Override
    public void addViewControllers(final ViewControllerRegistry registry) {
        registry.addViewController("/index.htm").setViewName("index");
    }
}

基于注解的控制器

package com.apress.prospringmvc.bookstore.web;    
import org.springframework.stereotype.Controller;    
import org.springframework.web.bind.annotation.RequestMapping;    
import org.springframework.web.servlet.ModelAndView;    
@Controller    
public class IndexController {    
@RequestMapping(value = "/index.htm")    
    public ModelAndView indexPage() {     
        return new ModelAndView("index");    
    }    
}     

我的问题是,对于 View Controller,通过添加 @Configuration@ComponentScan(basePackages = { "com.apress.prospringmvc.bookstore.web" }),后台会做什么? com.apress.prospringmvc.bookstore.web 包会为这些视图控制器提供一些东西吗?

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

    简单地说 - @ComponentScan 告诉 Spring 你在哪些包中注释了应该由 Spring 管理的类。因此,例如,如果您有一个带有 @Controller 注释的类,该类位于 Spring 未扫描的包中,您将无法将其用作 Spring 控制器。

    @Configuration 注释的类是一种 使用注释而不是XML 文件配置Spring 的方法(称为Java 配置)。 Spring 需要知道哪些包包含 Spring bean,否则您必须单独注册每个 bean。这就是 @ComponentScan 的用途。

    在您的示例中,您告诉 Spring 包 com.apress.prospringmvc.bookstore.web 包含应由 Spring 处理的类。然后 Spring 找到一个带有 @Controller 注释的类,并对其进行处理,这导致所有到达 /index.htm 的请求都被控制器拦截。

    当请求被拦截时,Spring 需要知道向调用者发送什么响应。由于您返回一个ModelAndView 的实例,它会尝试在您的项目中找到一个名为index 的视图(JSP 页面)(具体取决于配置的视图解析器),并将其呈现给用户。

    如果 @Controller 注释不存在,或者 Spring 没有扫描该包,所有这一切都是不可能的。

    【讨论】:

    • 所以对于我的例子,如果我删除@ComponentScan(),我的程序会因为缺少一些bean或其他东西而不再工作吗?
    • 是的,您的IndexController 将无法使用。
    • 似乎比刚才更清楚,但不是 100%。请问您能解释一下这两个类之间的关系吗?视图、“/index.htm”和控制器如何连接。
    • 我已经编辑了我的答案。如果您仍然不清楚,我建议您在 Spring 文档中寻找答案。
    猜你喜欢
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 2015-03-28
    • 2019-04-09
    • 2018-06-14
    • 2015-09-07
    相关资源
    最近更新 更多