当前位置: 首页 > article >正文

SpringMVC的全注解开发

文章目录

  • 一、spring-mvc.xml 中组件转化为注解形式
  • 二、DispatcherServlet加载核心配置类
  • 三、消除web.xml

一、spring-mvc.xml 中组件转化为注解形式

跟之前全注解开发思路一致, xml配置文件使用核心配置类替代,xml中的标签使用对应的注解替代

<!-- 组件扫描web层 -->
<context:component-scan base-package="com.itheima.controller"/>

<!--注解驱动-->
<mvc:annotation-driven/>

<!--配置文件上传解析器-->
<bean id="multipartResolver" 
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>

<!--配置拦截器-->
<mvc:interceptors>
	<mvc:interceptor>
		<mvc:mapping path="/*"/>
		<bean class="com.itheima.interceptor.MyInterceptor01"></bean>
	</mvc:interceptor>
</mvc:interceptors>

<!--配置DefaultServletHttpRequestHandler-->
<mvc:default-servlet-handler/>

⚫ 组件扫描,可以通过@ComponentScan注解完成;
⚫ 文件上传解析器multipartResolver可以通过非自定义Bean的注解配置方式,即@Bean注解完成

@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMVCConfig {
	@Bean
	public CommonsMultipartResolver multipartResolver() {
		CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
		multipartResolver.setDefaultEncoding("UTF-8");
		multipartResolver.setMaxUploadSize(3145728);
		multipartResolver.setMaxUploadSizePerFile(1048576);
		multipartResolver.setMaxInMemorySize(1048576);
		return multipartResolver;
	}
}

< mvc:annotation-driven>、< mvc:default-servlet-handler /> 和 < mvc:interceptor > 怎么办呢?SpringMVC 提供了一个注解@EnableWebMvc,我们看一下源码,内部通过@Import 导入了DelegatingWebMvcConfiguration类

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({DelegatingWebMvcConfiguration.class})
public @interface EnableWebMvc {}
@Configuration(proxyBeanMethods = false)
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
	private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();
	// 从容器中注入WebMvcConfigurer类型的Bean
	@Autowired(required = false)
	public void setConfigurers(List<WebMvcConfigurer> configurers) {
		if (!CollectionUtils.isEmpty(configurers)) {
			this.configurers.addWebMvcConfigurers(configurers);
		}
	}
	//省略其他代码
}

WebMvcConfigurer类型的Bean会被注入进来,然后被自动调用,所以可以实现WebMvcConfigurer接口,完成一些解析器、默认Servlet等的指定,WebMvcConfigurer接口定义如下:

public interface WebMvcConfigurer {
	// 配置默认Servet处理器
	default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { }
	
	// 添加拦截器
	default void addInterceptors(InterceptorRegistry registry) { }
	
	// 添加资源处理器
	default void addResourceHandlers(ResourceHandlerRegistry registry) { }
	
	// 添加视图控制器
	default void addViewControllers(ViewControllerRegistry registry) { }
	
	// 配置视图解析器
	default void configureViewResolvers(ViewResolverRegistry registry) { }
	
	// 添加参数解析器
	default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { }
	
	// ... 省略其他代码 ...
}

创建MyWebMvcConfigurer实现WebMvcConfigurer接口,实现addInterceptors 和 configureDefaultServletHandling方法

@Component
public class MyWebMvcConfigurer implements WebMvcConfigurer {
	@Override
	public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
		// 开启DefaultServlet,可以处理静态资源了
		configurer.enable();
	}
	
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// 创建拦截器对象,进行注册
		// Interceptor的执行顺序也取决于添加顺序
		registry.addInterceptor(new MyInterceptor01()).addPathPatterns("/*");
	}
}

最后,在SpringMVC核心配置类上添加@EnableWebMvc注解

@Configuration
@ComponentScan("com.itheima.controller")
@EnableWebMvc
public class SpringMVCConfig {
	@Bean
	public CommonsMultipartResolver multipartResolver(){
		CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
		multipartResolver.setDefaultEncoding("UTF-8");
		multipartResolver.setMaxUploadSize(3145728);
		multipartResolver.setMaxUploadSizePerFile(1048576);
		multipartResolver.setMaxInMemorySize(1048576);
		return multipartResolver;
	}
}

二、DispatcherServlet加载核心配置类

DispatcherServlet在进行SpringMVC配置文件加载时,使用的是以下方式:

<!--配置springMVC前端控制器-->
<servlet>
	<servlet-name>DispatcherServlet</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<!--指定springMVC配置文件位置-->
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:spring-mvc.xml</param-value>
	</init-param>
	<!--服务器启动就创建-->
	<load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
	<servlet-name>DispatcherServlet</servlet-name>
	<url-pattern>/</url-pattern>
</servlet-mapping>

现在是使用SpringMVCConfig核心配置类替代的spring-mvc.xml,怎么加载呢?参照Spring的ContextLoaderListener加载核心配置类的做法,定义了一个AnnotationConfigWebApplicationContext,通过代码注册核心配置类

public class MyAnnotationConfigWebApplicationContext extends AnnotationConfigWebApplicationContext {
	public MyAnnotationConfigWebApplicationContext() {
	// 注册核心配置类
	super.register(SpringMVCConfig.class);
	}
}
<!--指定springMVC的applicationContext全限定名 -->
<init-param>
	<param-name>contextClass</param-name>
	<param-value>com.itheima.config.MyAnnotationConfigWebApplicationContext</param-value>
</init-param>

三、消除web.xml

目前,几乎消除了配置文件,但是web工程的入口还是使用的web.xml进行配置的,如下:

<!--配置springMVC前端控制器-->
<servlet>
	<servlet-name>DispatcherServlet</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<!--指定springMVC的applicationContext全限定名 -->
	<init-param>
		<param-name>contextClass</param-name>
		<param-value>com.itheima.config.MyAnnotationConfigWebApplicationContext</param-value>
	</init-param>
	<!--服务器启动就创建-->
	<load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
	<servlet-name>DispatcherServlet</servlet-name>
	<url-pattern>/</url-pattern>
</servlet-mapping>

⚫ Servlet3.0环境中,web容器提供了javax.servlet.ServletContainerInitializer接口,实现了该接口后,在对应的类加载路径的META-INF/services 目录创建一个名为javax.servlet.ServletContainerInitializer的文件,文件内容指定具体的ServletContainerInitializer实现类,那么,当web容器启动时就会运行这个初始化器做一些组件内的初始化工作;
⚫ 基于这个特性,Spring就定义了一个SpringServletContainerInitializer实现了ServletContainerInitializer接口;
⚫ 而SpringServletContainerInitializer会查找实现了WebApplicationInitializer的类,Spring又提供了一个WebApplicationInitializer的基础实现类AbstractAnnotationConfigDispatcherServletInitializer,当我们编写类继承AbstractAnnotationConfigDispatcherServletInitializer时,容器就会自动发现我们自己的类,在该类中我们就可以配置Spring和SpringMVC的入口了。

按照下面的配置就可以完全省略web.xml

public class MyAnnotationConfigDispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

	// 返回的带有@Configuration注解的类用来配置ContextLoaderListener
	protected Class<?>[] getRootConfigClasses() {
		System.out.println("加载核心配置类创建ContextLoaderListener");
		return new Class[]{ApplicationContextConfig.class};
	}
	
	// 返回的带有@Configuration注解的类用来配置DispatcherServlet
	protected Class<?>[] getServletConfigClasses() {
		System.out.println("加载核心配置类创建DispatcherServlet");
		return new Class[]{SpringMVCConfig.class};
	}
	
	// 将一个或多个路径映射到DispatcherServlet上
	protected String[] getServletMappings() {
		return new String[]{"/"};
	}
}

http://www.kler.cn/a/7156.html

相关文章:

  • 智能网页内容截图工具:AI助力内容提取与可视化
  • MYSQL_深入理解自连接_图书借阅情况(2/2)
  • WebRTC视频 02 - 视频采集类 VideoCaptureModule
  • 爬虫——Requests库的使用
  • LlamaIndex+本地部署InternLM实践
  • 【windows笔记】08-Windows中的各种快捷方式、符号链接、目录联接、硬链接的区别和使用方法
  • MySQL开发02-数据库设计
  • Json交互处理_stata交互项检验
  • Huananzhi X99-AD3 Intel E5-2696v3黑苹果efi引导文件
  • Java 垃圾收集器
  • php防止表单重复提交的几种方法
  • 为什么要进行自动化测试,又有哪些需要注意的
  • rk3568 Android 添加IR遥控器
  • 交友项目【手机号登录注册功能】实现
  • MapGIS 6.7安装方法教程
  • (一)MyBatis源码阅读:明晰项目结构
  • 乐鑫 × 全国大学生物联网设计竞赛|探究基于 ESP32-S3 的农业革新应用
  • 【SQL开发实战技巧】系列(四十六):Oracle12C常用新特性☞会话级序列及数据泵(DataPump增强)支持像表一样导出视图
  • 单例设计模式
  • VS2019使用VLD(Visual Leak Detector)检测CPP内存泄漏
  • FPGA有哪些优质的带源码的IP开源网站?
  • ChatGPT如何写作-怎么让chatGPT批量写作
  • GPG Overview
  • 算法学习|动态规划 LeetCode 1049. 最后一块石头的重量 II、 494. 目标和、474.一和零
  • Vue3学习笔记(9.3)
  • 常用的32种设计模式