你是否再为配置文件web.xml容易出错而烦恼?是否为web.xml文件存放位置而不知所措?是否为web.xml为什么要这样配?怎么才能更好的配置web.xml而烦恼?那么一种新的方式出现了:

spring提供了支持servlet 3+以上的编程方式,它可以替换或者和web.xml共存的方式工作。其相关类如下:

WebApplicationInitializer

  传统上,我们基于web.xml这种方式来配置web应用,而WebApplicationInitializer的实现支持在servlet 3.0以上的环境里通过编程的方式来配置ServletContext,这种方式既可以替换web.xml这种方式,也可以和web.xml这种方式共存。

  这种SPI的实现通常由SpringServletContainerInitializer来自动发现,SpringServletContainerInitializer可以被servlet 3.0以上的容器自动启动。详细请参考下面的章节。示例如下:

传统基于xml的方式

绝大多数spring开发者构建web应用时需要注册spring DispatcherServlet到WEB/web.xml如下方式:

<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/dispatcher-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

基于编程方式的WebApplicationInitializer

下面基于WebApplicationInitializer样式的代码等同于DispatcherServlet的注册逻辑:

public class MyWebAppInitializer implements WebApplicationInitializer {

     @Override
public void onStartup(ServletContext container) {
XmlWebApplicationContext appContext = new XmlWebApplicationContext();
appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml"); ServletRegistration.Dynamic dispatcher =
container.addServlet("dispatcher", new DispatcherServlet(appContext));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
} }

上面的实现,还可以通过扩展org.springframework.web.servlet.support.AbstractDispatcherServletInitializer实现。

  如上所示,归功于servlet3.0的ServletContext#addServlet方法,我们注册一个DispatcherServlet的实例,这意味着DispatcherServlet可以如其他Object一样,接受在应用上下文中通过构造器进行注入。

  这种方式不但简单还很明了。不需要关注init-param的处理等等,仅有通常的javaBean样式的属性和构造参数。可以在DispatcherServlet注入之前,尽可能的自由的创建spring context、使用spring context。

  绝大部分spring web组件已经更新来支持这种注册方式,你会发现DispatcherServlet、FrameworkServlet、ContextLoaderListener和DelegatingFilterProxy现在都支持构造参数。

  尽管个别组件(非spring的,其他第三方的)没有更新到支持WebApplicationInitializer的使用,它们仍然可以使用。servlet 3.0的ServletContext api支持编码式设置init-params,context-param等的属性。

  基于编码式的配置

  上例中,WEB/web.xml可以通过WebApplicationInitializer样式的代码完全替换掉,但真正的dispatcher-config.xml spring配置文件仍然是基于xml方式的。WebApplicationInitializer也是一个很棒的方式来进行spring的基于编程方式的配置类,详情参考org.springframework.context.annotation.Configuration。

下面的例子中,将使用spring的

org.springframework.web.context.support.AnnotationConfigWebApplicationContext
类来替代XmlWebApplicationContext,用户自定义的@Configuration配置类AppConfig和DispatcherConfig来替换spring的xml文件来重构上面的例子。这个示例也有一些超出部分,用来展示root application context的的通用配置和ContextLoaderListener的注册:

public class MyWebAppInitializer implements WebApplicationInitializer {

     @Override
public void onStartup(ServletContext container) {
// Create the 'root' Spring application context
AnnotationConfigWebApplicationContext rootContext =
new AnnotationConfigWebApplicationContext();
rootContext.register(AppConfig.class); // Manage the lifecycle of the root application context
container.addListener(new ContextLoaderListener(rootContext)); // Create the dispatcher servlet's Spring application context
AnnotationConfigWebApplicationContext dispatcherContext =
new AnnotationConfigWebApplicationContext();
dispatcherContext.register(DispatcherConfig.class); // Register and map the dispatcher servlet
ServletRegistration.Dynamic dispatcher =
container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
} }

最新文章

  1. 源码编译安装postgresql
  2. Geometry关系高级操作
  3. 如何用Unity制作自定义字体——Custom Font
  4. WTF Forms – 使用 CSS 实现用户体验更好的表单
  5. [Visual Studio Online] 移除Work Item(Feature、Backlog item、Task)
  6. 理解C#中的闭包
  7. ChinaASP.Upload 错误 &#39;80040002&#39; You must add our copyright info
  8. 自定义uiview 当没有数据的时候 显示自定义的uiview界面
  9. OpenWRT 路由配置技巧
  10. BroadCastReceiver中耗时操作导致ANR
  11. 配置本地yum源的方法
  12. 【转】Mysql 根据时间戳按年月日分组统计
  13. POJ 1740 A New Stone Game(多堆博弈找规律)
  14. LeetCode OJ 101. Symmetric Tree
  15. javascript学习笔记01--javascript的基本介绍
  16. Linux下用rm删除的文件的恢复方法
  17. 【UOJ#177】欧拉回路
  18. 关于Sublime Text 3的几个问题总结
  19. python bytes/str
  20. Codeforces 570 - A/B/C/D/E - (Done)

热门文章

  1. yagmail四行代码发送邮件
  2. Cheat Engine 入门操作
  3. Mac使用安卓模拟器-网易MuMu
  4. HTML布局梳理
  5. Android数据库(sqlite)之Room
  6. 21 ~ express ~ 内容详情展示 和 阅读数处理
  7. HDU _2546 01背包问题
  8. 可重入排他锁ReentrantLock源码浅析
  9. D语言-变量、输入、输出、注释
  10. python pandas写入excel文件