按照之前传统的方式来配置SpringMVC需要在web.xml中配置DispatcherServlet,但是在Servlet3规范和Spring3.1之后新增了一种方式,那就是java和注解的方式进行配置,今天我们以Spring的最新版本5.2.0.RELEASE来进行一下配置,一起来看一下吧。
第一步:Servlet容器初始化
取消web.xml改用java来配置首先需要有一个入口,下图展示了这个入口,即先创建一个初始化的类MyWebInitializer,MyWebInitializer类继承了一个名为AbstractAnnotationConfigDispatcherServletInitializer的抽象类,同样这个抽象类实现了org.springframework.web.WebApplicationInitializer接口。
继承AbstractAnnotationConfigDispatcherServletInitializer需要实现三个方法,其中getServletMappings()会返回一个路径数组,将一个或多个路径映射到DispatcherServlet上,本例中它映射的是“/”,表示DispatcherServlet会处理所有的请求。
getServletConfigClasses()方法要返回一个带有@Configuration注解的类,这个类将会用来定义DispatcherServlet应用上下文。
getRootConfigClasses()方法要返回一个带有@Configuration注解的类,这个类将会用来配置原来xml中ContextLoaderListener所创建的应用上下文。
启动原理:
在Servlet3.0环境中容器会查找类路径下的实现了javax.servlet.ServletContainerInitializer接口的类,找到了就会用它来配置Servlet容器。从这个接口的全限定名称上可以看出它是java标准api的一部分,是在Servlet 3.0以后才添加的。Spring为这个接口提供了一个实现类:
这个实现类又会把配置任务交给WebApplicationInitializer接口的实现类来完成。我们这里实现的抽象类AbstractAnnotationConfigDispatcherServletInitializer正是WebApplicationInitializer的一个实现类。而我们的MyWebInitializer正是AbstractAnnotationConfigDispatcherServletInitializer的一个扩展,所以这样就把配置任务最终交给了我们自定义的这个配置类MyWebInitializer。
第二步:自定义SpringMVC配置
我们新建一个配置类,这个配置类需要实现接口WebMvcConfigurer,如图:
WebMvcConfigurer提供了回调方法来供我们自定义SpringMVC的默认配置。如果是使用@EnableWebMvc注解的话表示启用WebMvcConfigurationSupport类的默认配置。我们并没有使用@EnableWebMvc注解而是实现了WebMvcConfigurer,这样做是为了扩展。下面我们看下其中的方法:
viewResolver方法定义了一个bean,这个bean返回一个ViewResolver对象,这个对象是一个视图解析器。在其方法内部新建一个InternalResourceViewResolver实例来进行配置。其中setPrefix和setSuffix分别设置了视图的前缀和后缀。
configureDefaultServletHandling方法中我们调用了DefaultServletHandlerConfigurer对象的enable()方法,用于要求DispatcherServlet将对静态资源的请求转发到Servlet容器的默认Servlet上,而不是使用DispatcherServlet本身来处理。
addInterceptors方法用于添加SpringMVC的拦截器,图中将注入的拦截器myInterceptor进行注册并设置了拦截路径。拦截器的定义如下图:
第三步:配置RootConfig
配置RootConfig的类如下:
关于Spring中的其他组件可以在这里进行配置,比如扫描com.example包下的除了EnableWebMvc注解和Controller注解标记的其他bean。
第四步:编写控制器
如下图,我们编写了一个控制器,其中含有2个方法来接收请求。一个返回视图,一个返回数据。更丰富的功能我们这里就不展开了。
好啦,到这里就完成了用java和注解的方法来配置SpringMVC。当然了我们在这里只是讲解了SpringMVC的环境的搭建,其更加丰富的内容我们将在以后的文章中再一一论述。比如参数的接收和验证、渲染视图、上传文件、异常处理等等。感兴趣的小伙伴可以关注一下哦。
网友评论