当前位置: 首页 > 知识库问答 >
问题:

如何理解Spring@ComponentScan

钦景胜
2023-03-14

我正在遵循一个关于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");    
    }    
}     

我的问题是,对于视图控制器,通过添加@Configuration@ComponentScan(basePackages={“com.apress.prospringmvc.bookstore.web}),在后台会做什么?软件包com。按一下。prospringmvc。书店web为这些视图控制器提供了什么?

共有1个答案

萧凡
2023-03-14

简单地说,@ComponentScan告诉Spring哪些包中有应该由Spring管理的注释类。因此,例如,如果您有一个用@Controller注释的类,它在一个包中,没有被Spring扫描,那么您将无法将其用作Spring控制器。

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

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

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

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

 类似资料:
  • 我正在使用spring batch,在执行批处理作业时,我得到了一个InvalidIsolationLevelException。当我使用MapJobRepositoryFactoryBean时,该作业可以工作,但我需要在数据库中生成batch_*表。 应用程序已经设置了事务管理器。

  • 我是Spring Boot的新手,我看到了Spring Boot。上面写着: 可执行JAR和Java Java不提供任何加载嵌套jar文件的标准方法(即jar文件本身包含在jar中)。如果您希望分发一个自包含的应用程序,这可能会有问题。 为了解决这个问题,许多开发人员使用“优步”罐。优步罐只是简单地将所有罐中的所有类打包到一个存档中。这种方法的问题是很难看到你在应用程序中实际使用的库。如果在多个罐

  • 理解用户以及帮助你的boss理解用户是你的责任。因为用户没有像你一样密切地与你的产品的制造产生联系,他们的表现有点不同: 用户通常会做出简短的判断 用户有他们自己的工作,他们主要会思考你的产品中小的改进,而非大的改进 用户看不到你的产品的整个用户画像 你的责任是找出他们真实需要的东西,而非他们说他们需要的东西,然而,更好的是,在你开始前,建议他们,让他们同意你想做的,就是他们真实想要的东西,但他们

  • 本文向大家介绍你如何理解 Spring Boot 配置加载顺序?相关面试题,主要包含被问及你如何理解 Spring Boot 配置加载顺序?时的应答技巧和注意事项,需要的朋友参考一下 在 Spring Boot 里面,可以使用以下几种方式来加载配置。 1)properties文件; 2)YAML文件; 3)系统环境变量; 4)命令行参数; 等等……

  • 我使用spring解析数据json,格式如下: 请求 答复: 这是我在课堂上的方法: 在调用API之后,解析数据,下一步将按行归属消息插入数据。然后循环获取列表中的数据 当我运行此方法时,我可以从json数据中获取结果,但只有3个字段无法获取值,并且为null: 如何获得msisdn、total\u调用、total\u循环持续时间的值?非常感谢

  • 如何配置spring以使用返回类型?考虑代码: 我得到了404,但我在日志中看到该方法被触发。如果我这样更改签名: 我看到成功的json阵列。 如何使与spring(4.2.RELEASE)配合使用? 更新 对于测试,我编写了以下方法: 而且很有效。面向对象 我测试了这个版本的future: 有点激动,但是。。。作品 所以我原来的方法有以下逻辑: 迭代集合 通过每个集合元素的AsyncRestTe