动力节点旗下在线教育品牌  |  咨询热线:400-8080-105 学Java全栈,上蛙课网
首页 > 文章

无XML实现SpringMVC环境搭建

08-25 17:41 103浏览
举报 T字号
  • 大字
  • 中字
  • 小字

一些Spring MVC项目中, 我们可以看到, web.xml、springmvc.xml、applicationContext.xml这样的配置文件已经不见了, 取而代之的是各种的注解, 注解开发给我们带来了很多的便利, 利用JavaConfig完成项目的配置会显得更加的"高端", 本文主要分析的是XML实现SpringMVC环境搭建过程和原理。

下面是实现无xml实现SpringMVC环境搭建的具体步骤和原理;

通过对DispatcherServlet初始化流程源码分析, 我们需要知道一个点, 之前我们配置SpringMVC的环境的时候,是在web.xml中配置了DispatcherServlet的映射关系, 并且利用监听器注册了一个Spring容器, 在xml中配置DispatcherServlet的映射关系, 其实就是将DispatcherServlet这个Servlet加入到了Servlet上下文中而已,  貌似我们可以手动的创建DispatcherServlet对象, 然后加到ServletContext中?

其次, 没有了springmvc.xml文件, xml文件中配置的annotation-driven以及component-scan这些功能就没法启用, 没法开启注解配置以及配置扫描的包了

再一次回顾之前学习过的DispatcherServlet初始化流程源码分析的内容, DispatcherServlet继承于FrameworkServlet,FrameworkServlet重写了GenericServlet的空参init方法, 在这个重写的方法中完成了容器的初始化, 于是乎, 我们再来回顾一下, 容器的获取方式, 通常情况下, 是在这个初始化的过程中会自动创建web容器, 但是这个创建的web容器xmlApplicationContext, 并且不方便我们去控制其创建的过程, 但是在原来的源码分析中,  我们可以手动的往DispatcherServlet中set一个容器, 那就好办了, 我们往里面set一个注解配置的容器, 而不是xml配置的容器, 于是, 无xml配置的原理就出来了, 我们先看一下代码:

public class MyWebInit implements ServletContainerInitializer {

    @Override

    public void onStartup(Set> c, ServletContext ctx) {

        AnnotationConfigWebApplicationContext context

                                                = new AnnotationConfigWebApplicationContext();

        context.register( SpringConfig.class );

 

        DispatcherServlet dispatcherServlet = new DispatcherServlet();

        dispatcherServlet.setApplicationContext( context );

        ServletRegistration.Dynamic registration

                                = ctx.addServlet( "dispatcherServlet", dispatcherServlet );

        registration.addMapping( "/" );

        registration.setLoadOnStartup( 1 );

        // registration.setInitParameter();

    }

}

我们对上面的代码进行分析:

    1. 手动创建一个注解配置的Web容器, 如果对Spring源码有所了解, 那么register方法应该不会陌生, 就是注册一个配置类, 这个配置类的内容很简单:

            @Configuration

            @ComponentScan( "com.test" )

            @EnableWebMvc

            public class SpringConfig {}

 

   2.我们在独立的Spring环境下, 创建Spring环境是这样的: AnnotationConfigApplicationContext context                                    = new AnnotationConfigApplicationContext(SpringConfig.class);

        可以在构造器中放入一个配置类, 构造器被执行的时候, 会调用register方法将SpringConfig配置类注册到容器中, 同时调用refresh方法开始完成容器的初始化, 在web环境下的容器, 没有提供一个构造器可以传递配置类的, 于是我们才手动调用register方法来注册一个配置类, 注意了, 我们没有调用refresh方法

   3.手动创建一个DispatcherServlet, 同时将创建好的web容器设置到DispatcherServlet中, 之后DispatcherServlet在初始化的时候就不会自己创建了, 而是采用我们传入的这个

   4.DispatcherServlet添加到Servlet上下文中, 就等价于在web.xml中配置了一个DispatcherServlet,然后利用返回值registration(ServletRegistration.Dynamic类型的)添加这个Servlet需要拦截的请求,最后两行就等价于在web.xml中的配置:

<init-param>

                <param-name>contextConfigLocation</param-name>

                <param-value>classpath:spring-mvc.xml</param-value>

            </init-param>

            <load-on-startup>1</load-on-startup>

5.到此为止, 我们利用Java代码完成了在web.xml中配置的DispatcherServlet的功能, 与此同时, 整合了注解配置的web容器与DispatcherServlet, 再来说下为什么我们不主动调用refresh方法刷新容器, 回顾一下DispatcherServlet初始化流程源码分析, 原来的web容器是在FrameworkServlet的空参init方法被触发创建的, 由于我们手动放入了web容器, 所以就不会手动创建, 大家可以回顾下之前的文章内容, 我们着重的讲解了在容器创建后或者从DisatcherServlet中取到了设置进去的容器后, 会调用一个configureAndRefreshWebApplicationContext方法, 在这个方法中的最后有这么一行代码:

   wac.refresh();

对于上面的整个无XML配置实现SpringMVC环境搭建的过程我们做一些总结:

我们知道在FrameworkServlet中就会帮我们主动调用refresh方法, 如果在此时我们先调用的话, 那么可能会有些问题, 因为在configureAndRefreshWebApplicationContext方法中, 调用refresh方法之前, 会对容器进行一定的设置, 比如说环境、监听器(用于触发SpringMVC的九大策略的初始化)等, 所以我们不能在这个时候去调用实现无xml完成的SpringMVC环境搭建的原理其实很简单, 就是利用了Servlet3.0规范提供的ServletContainerInitializer接口来完成的, 因为这个接口会传入一个ServletContext, 所以我们可以直接对ServletContext进行操作, 放入DispatcherServlet, 同时利用注解配置的上下文完成Spring环境的引入, 由此我们已经可以直接将各种的xml配置文件删除了, 如果是Spring或者SpringMVC的配置, 可以利用上面的SpringConfig这个类来完成, 而如果是web.xml的配置, 可以利用MyWebInit类中onStartUp方法来完成

事实上,无XML配置实现Spring MVC的环境搭建对于Spring MVC框架本身而言有着重要的意义,不仅大大减少了配置XML需要的时间,同时也加深了Spring MVC中容器的作用。你想要学习的Spring MVC框架知识在本站的Spring MVC视频教程里应有尽有,源源不断的知识在等你汲取!

0人推荐
共同学习,写下你的评论
0条评论
上善若水
程序员上善若水

16篇文章贡献85593字

作者相关文章更多>

推荐相关文章更多>

DOM渲染的详细过程

QCode09-04 14:38

CSS水平和垂直居中技巧大梳理

Code大师09-04 14:50

mui的input框在IOS系统下无法聚焦或点击多次才能聚焦

不写代码你养我啊08-23 11:14

推荐的-视.频播放器以及在线客服

不写代码你养我啊09-17 18:02

谈谈java多线程的三大特性

要学习了06-18 18:13

发评论

举报

0/150

取消