gpt4 book ai didi

java - 如何理解 Spring @ComponentScan

转载 作者:行者123 更新时间:2023-12-03 14:15:12 25 4
gpt4 key购买 nike

我正在关注有关 Spring MVC 的教程,但我无法理解 @ComponentScan 的某些内容即使在阅读了 spring API 文档之后也可以进行注释,所以这里是示例代码:
配置 View Controller

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");
}
}
基于注解的 Controller
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为这些 View Controller 提供一些东西?

最佳答案

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

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

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

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

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

关于java - 如何理解 Spring @ComponentScan,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28963639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com