了解Spring Web初始化

几年前,我们大多数人习惯到处编写XML配置文件,甚至可以设置简单的Java EE应用程序。 如今,使用Java或Groovy来配置项目已成为一种首选方式–您只需要看一下Spring框架的其他版本中引入的Gradle或功能,就可以对此进行总结。

现在,我将为Web应用程序配置Spring上下文。

Java EE提供了ServletContainerInitializer接口,该接口允许在Web应用程序启动时通知库。 从Spring 3.1开始,我们有了SpringServletContainerInitializer类,该类通过实例化所有实现此接口的找到的类来处理WebApplicationInitializer ,并根据@Order注释对它们进行排序(未注释的类获得最高的顺序,因此它们将在最后处理)并调用onStartup()方法。

3.2版开始的Spring给我们提供了一些实现WebApplicationInitializer接口的类,首先是AbstractContextLoaderInitializer 。 spring-web模块中包含的此类使用抽象的createRootApplicationContext()方法创建应用程序上下文,并将其委托给ContextLoaderListener ,然后将其注册到ServletContext实例中。 使用此类创建应用程序上下文如下所示:

public class SpringAnnotationWebInitializer
  extends AbstractContextLoaderInitializer {

  @Override
  protected WebApplicationContext createRootApplicationContext() {
    AnnotationConfigWebApplicationContext applicationContext =
      new AnnotationConfigWebApplicationContext();
    applicationContext.register(SpringAnnotationConfig.class);
    return applicationContext;
  }

}

这是启动Spring Web上下文的最简单方法。 但是,如果我们想体验Spring MVC提供的好处,并且不想手动注册DispatcherServlet ,那么最好使用另一个类: AbstractDispatcherServletInitializer 。 它扩展了上一类,并添加了两个抽象方法: createServletApplicationContext()getServletMappings() 。 第一个方法返回将传递给DispatcherServlet的 WebApplicationContext ,它将自动添加到容器ServletContext中 。 请注意,此上下文将被建立为createRootApplicationContext()方法返回的上下文的子级。 第二种方法-您可能已经推论出了-返回在servlet注册期间使用的映射。 如果需要任何自定义过滤器,还可以重写getServletFilters()方法,因为默认实现只返回空数组。 使用此类的示例性实现可以是:

public class SpringWebMvcInitializer
  extends AbstractDispatcherServletInitializer {

  @Override
  protected WebApplicationContext createRootApplicationContext() {
    AnnotationConfigWebApplicationContext applicationContext =
      new AnnotationConfigWebApplicationContext();
    applicationContext.register(SpringRootConfig.class);
    return applicationContext;
  }

  @Override
  protected WebApplicationContext createServletApplicationContext() {
    AnnotationConfigWebApplicationContext applicationContext =
      new AnnotationConfigWebApplicationContext();
    applicationContext.register(SpringMvcConfig.class);
    return applicationContext;
  }

  @Override
  protected String[] getServletMappings() {
    return new String[]{"/*"};
  }

}

现在最后但绝对不是最不重要的一类: AbstractAnnotationConfigDispatcherServletInitializer 。 在这里,我们可以看到简化Spring初始化的进一步步骤-我们不需要手动创建上下文,而只需在getRootConfigClasses()getServletConfigClasses()方法中设置适当的配置类。 我希望您已经熟悉这些名称,因为它们的工作方式与前一种情况完全相同。 当然,由于此类扩展了AbstractDispatcherServletInitializer,我们仍然可以重写getServletFilters() 。 最后,我们可以通过以下方式实现我们的配置:

public class SpringWebMvcSimpleInitializer
  extends AbstractAnnotationConfigDispatcherServletInitializer {

  @Override
  protected Class<?>[] getRootConfigClasses() {
    return new Class[] {SpringRootConfig.class};
  }

  @Override
  protected Class<?>[] getServletConfigClasses() {
    return new Class[] {SpringMvcConfig.class};
  }

  @Override
  protected String[] getServletMappings() {
    return new String[]{"/*"};
  }

}

参考:Java(B)Log博客的JCG合作伙伴 Jakub Kubrynski 了解Spring Web初始化

翻译自: https://www.javacodegeeks.com/2014/01/understanding-spring-web-initialization.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值