SpringMVC-全注解模式

前言

我们都知道,在Spring中,具有XML与注解两种 应用spring 的模式,与之类似的,在SpringMVC中也有XML和注解两种模式,这篇博客,主要想讲一讲SpringMVC全注解模式的实现

正文

在内容正式开始前,我们需要知道以下几点:

  • SpringMVC 是一个偏向于前端的框架
  • 需要配置 web.xml 给 Tomcat 进行解析
  • 需要配置 Controller 用来进行后台的处理操作

实现过程

不想看详细步骤的可直接跳转到最底部,去看我写的注释哦,个人感觉应该挺全面的。(虽然也是特别长的一堆)

注意了: @Controller 内部有 @Component 注解,所以不会专门来讲如何配置 Controller...

配置配置类,用来代替XML文件

这一步的大部分操作到现在了还详细讲的话,不是显得我很水吗? 所以这里只提一些比较关键的内容

  1. mvc命名空间中一些比较特殊的标签:
  • <mvc:default-servlet-handler> 可以向容器中注册静态资源处理器,另外啊,静态资源这里是指那些静态图片,HTML网页 ,如果你想通过这个来显示动态的GIF,那么很遗憾的告诉你,干不了。

  • <mvc:annotation-driven/> 注册注解驱动,其中包含了:

    • RequestMappingHandlerMapping 的 注册 (动态资源访问
    • MappingJackson2HttpMessageConverter 的 注册 (Json的识别与转换, XML注入时需要注意是 List
  1. mvc 命名空间从标签转成注释的正确方式:@EnableWebMvc 该注解在底层使用@Import注解导入了一个类,而这个类包含几乎所有 对应着 mvc 命名空间标签的方法

自定义类替代web.xml

web.xml在SpringMVC中特别重要,所以想要实现全注解,就要考虑将这个XML文件替换掉,而由于它不同于普通的XML文件,具体体现在普通的XML文件是Spring容器去读取,而web.xml是Tomcat大哥去读取,这个Level,谁得谁不迷糊啊?(叉腰)

  • 首先,就是要配置 ServletContainerInitializer 来初始化SpringMVC容器,具体的呢,就是创一个实现了这个接口的类,这个类直接影响着未来去读取配置类的容器,所以万万不可马虎大意,

    • 在内部可以重写onStartup方法用来存入 filter,listener,Servlet 等等组件,需要注意的是,这三个家伙一个都不好惹,一个可以过滤数据,一个可以监听数据,一个可以响应数据,还都是在服务器层面上的,你说 NB 不 NB?
    • 可以通过 @HandlesTypes 注解来导入自定义的类放进 onStartup方法的 Set集合(第一个参数)
  • 然后,要想这个类被读取,就得在配置类中配置相关内容? 大错特错,容器都没得,怎么读取呀?所以这里需要用到在底层代码中固定好了的格式来导入,具体的...Emmm ,去看我的注释吧

  • 再然后,就是 配置 WebMvcConfigurer (SpringMVC中用来设定 资源访问权限 的接口)

    • 创建一个实现了该接口的类并重写 configureDefaultServletHandling 方法,可以在其中使用enable() 方法来开启静态资源的访问权限,需要注意的是,即使已经注册了静态资源处理器,在该方法没调用时,仍然不能访问静态资源
      • 在该方法的末尾要调用父类的该方法,这或许就是源码的魅力之一,普通人看不懂,高手不需要看,照做就行。
    • 通过重写 addInterceptors 方法添加拦截器,需要注意的是 拦截器和过滤器不是一个东西哦
    • 拦截器(Interceptor): 作用在请求处理前后,不同的拦截器内部的方法具有严格的执行顺序。
    • 过滤器(Filter):作用在请求处理之前,不同的过滤器即使存入时具有一定的顺序,执行时它们不会那么听话,想上就上,不想上就延后
  • 配置 AbstractAnnotationConfigDispatcherServletInitializer(名字好长)

    (代表注解形式 DispatcherServlet初始化的抽象类)

    • 其中
    • getRootConfigClasses 方法用来获取 Spring容器 的配置类

    • getServletConfigClasses 方法用来获取 SpringMVC容器 的配置类,返回值为Class类型

    • getServletMappings 方法用来获取项目的映射路径 内部的返回值推荐为 new String[]{"/"};这个路径我不知道是干嘛的,一开始以为是项目的前置路径,但发现有错误

恩,差不多啦,完成了以上步骤后,你就可以开启你的Tomcat

最终答案(注释)

/**
 *  MVC实现全注解( 由于各种原因,这里只讲怎么操作,不涉及底层原理 )
 *      * 配置类替代XML文件
 *          * 配置类外部
 *              * 使用 @Configuration 标注配置类
 *              *
 *              * 使用 @ComponentScan 替代相关标签
 *              *
 *              * 使用 @PropertySource 导入配置的 properties文件
 *              *
 *              * 使用 @EnableWebMvc 替代 XML 中大部分的 MVC 标签
 *          * 配置类内部
 *              * 使用 @Bean 注入文件上传解析器 (具体请看代码中的注释,这里插入代码影响可读性)
 *                  * 在参数中可以使用EL表达式导入properties中配置的内容
 *                  *
 *              * 使用 @Bean 注入可以导入 拦截器 的类
 *                  *该类通常是实现了 WebMvcConfigurer 接口的类,而 WebMvcConfigurer 在底层被一个List集合引用,
 *                   所以这一步实际上是把 WebMvcConfigurer 接口放入容器,供底层进行引用
 *                  *
 *              *
 *      * 自定义类替代 web.xml
 *          * 配置 ServletContainerInitializer( SpringMVC容器的初始化接口 )
 *              * 创建一个实现了 ServletContainerInitializer 接口的类
 *                  * 在内部可以重写 onStartup 方法,并在该方法中添加 filter,listener,Servlet 等等组件
 *                    还可以通过 @HandlesTypes 注解来导入自定义的类放进 Set集合(第一个参数)
 *
 *              *
 *              * 需要在类加载目录(资源根目录)中作如下创建
 *                  ==> META-INF ==> services ==> javax.servlet.ServletContainerInitializer.txt
 *                并在该文本文件中添加实现了 ServletContainerInitializer 接口的类的引用路径(不需要添加其他东西!!!)
 *              *
 *          * 配置 WebMvcConfigurer (SpringMVC中用来设定 资源访问权限 的接口)
 *              * 创建一个实现了 WebMvcConfigurer 接口的类
 *                  * 在该类中重写 configureDefaultServletHandling 方法
 *                      * 使用参数的 enable 方法开启静态资源的访问权限,
 *                      *
 *                    需要在方法末尾调用父类的该方法,不然会报错
 *                  *
 *                  * 通过重写 addInterceptors 方法添加拦截器
 *          * 配置 AbstractAnnotationConfigDispatcherServletInitializer (代表注解形式 DispatcherServlet初始化的抽象类)
 *              * getRootConfigClasses 方法用来获取 Spring容器 的配置类
 *              *
 *              * getServletConfigClasses 方法用来获取 SpringMVC容器 的配置类
 *              *
 *              * getServletMappings 方法用来获取项目的映射路径 内部的返回值推荐为 new String[]{"/"};
 *              *
 *          * 配置完成,是时候删除你的 web.xml 啦。
 *          *
 *      *现在愉快地开启你的Tomcat叭
 */
复制代码

别问我为什么不导入代码,你就瞅瞅这个注释,如果加了代码,谁还愿意看哪?除了审核。(估计连我自己都不想看)

总结

没啥需要总结的,都在正文里了,我实在是浓缩不出其他东西了,底层原理估计讲了也没几个人听得懂,包括我自己(流汗流汗)

作者:花落人散处
链接:https://juejin.cn/post/7222573397305212988

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值