Spring配置项<context:component-scan/>和<mvc:annotation-driven/>

<mvc:annotation-driven/>

关于这个标签,网上很多资料的信息都过时了,还是基于Spring3.1以前的版本(现在最新的是5.1.2),通过调试源码查看Log并查资料,总结如下:

其对应的实现类:org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser

它会向Spring容器中注册14个Bean,而其中主要的是下面几个:

1 RequestMappingHandlerMapping
2 BeanNameUrlHandlerMapping
3 RequestMappingHandlerAdapter
4 HttpRequestHandlerAdapter
5 SimpleControllerHandlerAdapter
6 ExceptionHandlerExceptionResolver
7 ResponseStatusExceptionResolver
8 DefaultHandlerExceptionResolver

上面几个Bean实例,都是用来做什么的呢?

关于它们的详细功能,在IDEA中将光标移动到AnnotationDrivenBeanDefinitionParser类名上,按Ctrl+q即可查看类文档。

前两个是HandlerMapping接口的实现类,用来处理请求映射的

  • 其中第一个是处理@RequestMapping注解的
  • 第二个会将controller类的名字映射为请求url

中间三个是用来处理请求的.具体点说就是确定调用哪个controller的哪个方法来处理当前请求

  • 第一个处理@Controller注解的处理器,支持自定义方法参数和返回值(很酷)
  • 第二个是处理继承HttpRequestHandler的处理器
  • 第三个处理继承自Controller接口的处理器

后面三个是用来处理异常的解析器

另外还将提供以下支持:
① 支持使用ConversionService实例对表单参数进行类型转换; 
② 支持使用@NumberFormatannotation,@DateTimeFormat注解完成数据类型的格式化; 
③ 支持使用@Valid注解对Java bean实例进行JSR 303验证; 
④ 支持使用@RequestBody和@ResponseBody注解

 

综上,<mvc:annotation-driven/>标签主要是用来帮助我们处理请求映射,决定是哪个controller的哪个方法来处理当前请求,以及异常处理。

而在最新的spring项目中,如果不配置<mvc:annotation-driven/>,应用也可以正常处理请求。原因是什么呢?

经过debug DispatcherServlet的源码,发现如果不配置,spring将从DispatcherServlet.properties这个配置文件中加载默认配置,也是可以将上述的所有类注册到容器中的。

因此<mvc:annotation-driven/>这个标签其实是可以省略不写的。

 

<context:annotation-config/>

这是一条向Spring容器中注册

AutowiredAnnotationBeanPostProcessor

CommonAnnotationBeanPostProcessor

PersistenceAnnotationBeanPostProcessor

RequiredAnnotationBeanPostProcessor

这4个BeanPostProcessor.注册这4个BeanPostProcessor的作用,就是为了你的系统能够识别相应的注解。

那么哪些注释依赖这些Bean呢。

如果想使用 @Resource、@PostConstruct、@PreDestroy等注解就必须声明CommonAnnotationBeanPostProcessor。 
如果想使用 @PersistenceContext注解,就必须声明PersistenceAnnotationBeanPostProcessor的Bean。 
如果想使用 @Autowired注解,那么就必须事先在 Spring 容器中声明 AutowiredAnnotationBeanPostProcessor Bean。 
如果想使用 @Required的注解,就必须声明RequiredAnnotationBeanPostProcessor的Bean。

同样,传统的声明方式如下: 

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor "/> 

但是,就一般而言,这些注解我们是经常使用,比如Antowired,Resuource等注解,如果总是按照传统的方式一条一条的配置,感觉比较繁琐和机械。于是Spring给我们提供了<context:annotation-config/>的简化的配置方式。

注意:即使你使用了<context:annotation-config/>注解,以@Autowired为例,对于需要注入的Bean,仍然还要在xml中手动声明。这样很不方便,因此就引出了下面的<context:component-scan>注解。

 

<context:component-scan>

<context:component-scan>首先有和<context:annotation-config/>一样的作用,此外,它还可以扫描指定包下的类,将拥有注解的它们注册到Spring容器中。

 

综上,也就是说,如果用<context:annotation-config/>,我们还需要配置Xml注册Bean,而使用<context:component-scan />的话,注册的步骤都免了,当然前提是我们对需要扫描的类使用的注解(比如@Componet,@Service),而如果同时使用两个配置的话,<context:annotation-config/>会被忽略掉(如果配置了<context:component-scan>,就可以不配置<context:annotation-config/>了)。

 

转载于:https://www.cnblogs.com/darknebula/p/9975886.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Spring 6中使用Spring MVC的初始化案例。 1. 首先,确保你的目中已经包含了Spring MVC和Jakarta Servlet API的依赖。你可以在Maven或Gradle中添加以下依赖: ```xml <!-- Maven 依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>6.0.0-M1</version> </dependency> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>4.0.3</version> <scope>provided</scope> </dependency> ``` ```groovy // Gradle 依赖 implementation 'org.springframework:spring-webmvc:6.0.0-M1' compileOnly 'jakarta.servlet:jakarta.servlet-api:4.0.3' ``` 2. 在Web应用程序中,需要在web.xml文件中配置Spring MVC的DispatcherServlet。以下是一个基本的web.xml文件示例: ```xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <display-name>Spring MVC Application</display-name> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-mvc-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app> ``` 在这个示例中,我们定义了一个名为“dispatcherServlet”的Servlet,并将它映射到根路径“/”。其中,`servlet-class`是Spring MVC的`DispatcherServlet`类,`init-param`中的`contextConfigLocation`参数指定了Spring MVC配置文件的位置。 3. 创建Spring MVC配置文件`spring-mvc-config.xml`,并将其放置在WEB-INF目录下。以下是一个基本的Spring MVC配置文件示例: ```xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <context:component-scan base-package="com.example.controller"/> <mvc:annotation-driven/> </beans> ``` 在这个示例中,我们启用了Spring MVC的注解驱动(`<mvc:annotation-driven/>`),并使用`<context:component-scan>`扫描了一个名为`com.example.controller`的包,以寻找注解为`@Controller`的类。 4. 创建一个控制器类`HelloController`,并使用`@Controller`注解将其标记为Spring MVC控制器。以下是一个基本的控制器类示例: ```java package com.example.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class HelloController { @GetMapping("/hello") @ResponseBody public String hello() { return "Hello, Spring MVC!"; } } ``` 在这个示例中,我们使用`@Controller`注解将`HelloController`标记为一个Spring MVC控制器,并使用`@GetMapping`注解将`hello()`方法映射到路径`/hello`上。同时,使用`@ResponseBody`注解告诉Spring MVC将方法的返回值作为响应正文返回给客户端。 5. 启动你的Web应用程序,并在浏览器中访问`http://localhost:8080/hello`,你应该可以看到“Hello, Spring MVC!”的响应。 希望这个示例可以帮助你了解如何在Spring 6中使用Spring MVC。如果你还有其他问题,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值