如何理解Spring @ComponentScan

时间:2015-03-10 12:23:13

标签: spring-mvc

我正在关注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 Controllers,添加
    @Configuration和
    @ComponentScan(basePackages = {“com.apress.prospringmvc.bookstore.web”}) 在后台会做什么? com.apress.prospringmvc.bookstore.web包是否会为这个视图控制器提供一些东西?

1 个答案:

答案 0 :(得分:17)

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

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

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

当请求被截获时,Spring需要知道发送给调用者的响应。由于您返回ModelAndView的实例,它将尝试在项目中查找名为index的视图(JSP页面)(详细信息取决于已配置的视图解析器),并将其呈现给用户。

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