0


SpringMVC的全注解开发

文章目录

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

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

<!-- 组件扫描web层 --><context:component-scanbase-package="com.itheima.controller"/><!--注解驱动--><mvc:annotation-driven/><!--配置文件上传解析器--><beanid="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/><!--配置拦截器--><mvc:interceptors><mvc:interceptor><mvc:mappingpath="/*"/><beanclass="com.itheima.interceptor.MyInterceptor01"></bean></mvc:interceptor></mvc:interceptors><!--配置DefaultServletHttpRequestHandler--><mvc:default-servlet-handler/>

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

@Configuration@ComponentScan("com.itheima.controller")publicclassSpringMVCConfig{@BeanpublicCommonsMultipartResolvermultipartResolver(){CommonsMultipartResolver multipartResolver =newCommonsMultipartResolver();
        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@interfaceEnableWebMvc{}
@Configuration(proxyBeanMethods =false)publicclassDelegatingWebMvcConfigurationextendsWebMvcConfigurationSupport{privatefinalWebMvcConfigurerComposite configurers =newWebMvcConfigurerComposite();// 从容器中注入WebMvcConfigurer类型的Bean@Autowired(required =false)publicvoidsetConfigurers(List<WebMvcConfigurer> configurers){if(!CollectionUtils.isEmpty(configurers)){this.configurers.addWebMvcConfigurers(configurers);}}//省略其他代码}

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

publicinterfaceWebMvcConfigurer{// 配置默认Servet处理器defaultvoidconfigureDefaultServletHandling(DefaultServletHandlerConfigurer configurer){}// 添加拦截器defaultvoidaddInterceptors(InterceptorRegistry registry){}// 添加资源处理器defaultvoidaddResourceHandlers(ResourceHandlerRegistry registry){}// 添加视图控制器defaultvoidaddViewControllers(ViewControllerRegistry registry){}// 配置视图解析器defaultvoidconfigureViewResolvers(ViewResolverRegistry registry){}// 添加参数解析器defaultvoidaddArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers){}// ... 省略其他代码 ...}

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

@ComponentpublicclassMyWebMvcConfigurerimplementsWebMvcConfigurer{@OverridepublicvoidconfigureDefaultServletHandling(DefaultServletHandlerConfigurer configurer){// 开启DefaultServlet,可以处理静态资源了
        configurer.enable();}@OverridepublicvoidaddInterceptors(InterceptorRegistry registry){// 创建拦截器对象,进行注册// Interceptor的执行顺序也取决于添加顺序
        registry.addInterceptor(newMyInterceptor01()).addPathPatterns("/*");}}

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

@Configuration@ComponentScan("com.itheima.controller")@EnableWebMvcpublicclassSpringMVCConfig{@BeanpublicCommonsMultipartResolvermultipartResolver(){CommonsMultipartResolver multipartResolver =newCommonsMultipartResolver();
        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,通过代码注册核心配置类

publicclassMyAnnotationConfigWebApplicationContextextendsAnnotationConfigWebApplicationContext{publicMyAnnotationConfigWebApplicationContext(){// 注册核心配置类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

publicclassMyAnnotationConfigDispatcherServletInitializerextendsAbstractAnnotationConfigDispatcherServletInitializer{// 返回的带有@Configuration注解的类用来配置ContextLoaderListenerprotectedClass<?>[]getRootConfigClasses(){System.out.println("加载核心配置类创建ContextLoaderListener");returnnewClass[]{ApplicationContextConfig.class};}// 返回的带有@Configuration注解的类用来配置DispatcherServletprotectedClass<?>[]getServletConfigClasses(){System.out.println("加载核心配置类创建DispatcherServlet");returnnewClass[]{SpringMVCConfig.class};}// 将一个或多个路径映射到DispatcherServlet上protectedString[]getServletMappings(){returnnewString[]{"/"};}}
标签: java spring SpringMVC

本文转载自: https://blog.csdn.net/qq_36602071/article/details/129826994
版权归原作者 Super_Leng 所有, 如有侵权,请联系我们删除。

“SpringMVC的全注解开发”的评论:

还没有评论