在一些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视频教程里应有尽有,源源不断的知识在等你汲取!
QCode09-04 14:38
Code大师09-04 14:50
不写代码你养我啊08-23 11:14
不写代码你养我啊09-17 18:02
要学习了06-18 18:13