http://zetcode.com/spring/webapplicationinitializer/

Spring WebApplicationInitializer教程展示了如何使用WebApplicationInitializer以编程方式引导 Spring Web 应用。

Spring 是用于创建企业应用的流行 Java 应用框架。

WebApplicationInitializer

WebApplicationInitializer用于引导 Spring Web 应用。 WebApplicationInitializer注册一个 Spring DispatcherServlet并创建一个 Spring Web 应用上下文。 通常,开发者使用AbstractAnnotationConfigDispatcherServletInitializer(它是WebApplicationInitializer的实现)来创建 Spring Web 应用。

传统上,基于 Servlet 的 Java Web 应用使用web.xml文件来配置 Java Web 应用。 从 Servlet 3.0 开始,可以通过 Servlet 上下文监听器以编程方式创建 Web 应用。

Spring WebApplicationInitializer示例

以下应用使用WebApplicationInitializer创建 Spring Web 应用。

  1. pom.xml
  2. src
  3. ├───main
  4. ├───java
  5. └───com
  6. └───zetcode
  7. ├───config
  8. MyWebInitializer.java
  9. WebConfig.java
  10. └───controller
  11. MyController.java
  12. └───resources
  13. └───test
  14. └───java

这是项目结构。

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  5. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  6. <modelVersion>4.0.0</modelVersion>
  7. <groupId>com.zetcode</groupId>
  8. <artifactId>mockmvcex</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10. <packaging>war</packaging>
  11. <properties>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <maven.compiler.source>11</maven.compiler.source>
  14. <maven.compiler.target>11</maven.compiler.target>
  15. <spring-version>5.1.3.RELEASE</spring-version>
  16. </properties>
  17. <dependencies>
  18. <dependency>
  19. <groupId>ch.qos.logback</groupId>
  20. <artifactId>logback-classic</artifactId>
  21. <version>1.2.3</version>
  22. </dependency>
  23. <dependency>
  24. <groupId>javax.servlet</groupId>
  25. <artifactId>javax.servlet-api</artifactId>
  26. <version>4.0.1</version>
  27. <scope>provided</scope>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework</groupId>
  31. <artifactId>spring-webmvc</artifactId>
  32. <version>5.1.3.RELEASE</version>
  33. </dependency>
  34. </dependencies>
  35. <build>
  36. <plugins>
  37. <plugin>
  38. <groupId>org.apache.maven.plugins</groupId>
  39. <artifactId>maven-war-plugin</artifactId>
  40. <version>3.2.2</version>
  41. </plugin>
  42. </plugins>
  43. </build>
  44. </project>

pom.xml文件中,我们具有以下依存关系:logback-classic javax.servlet-apispring-webmvc

com/zetcode/config/MyWebInitializer.java

  1. package com.zetcode.config;
  2. import org.springframework.web.WebApplicationInitializer;
  3. import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
  4. import org.springframework.web.servlet.DispatcherServlet;
  5. import javax.servlet.ServletContext;
  6. import javax.servlet.ServletException;
  7. public class MyWebInitializer implements WebApplicationInitializer {
  8. @Override
  9. public void onStartup(ServletContext servletContext) throws ServletException {
  10. var ctx = new AnnotationConfigWebApplicationContext();
  11. ctx.register(WebConfig.class);
  12. ctx.setServletContext(servletContext);
  13. var servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));
  14. servlet.setLoadOnStartup(1);
  15. servlet.addMapping("/");
  16. }
  17. }

MyWebInitializer实现WebApplicationInitializer接口。 引导代码在onStartup()方法中。

  1. var ctx = new AnnotationConfigWebApplicationContext();
  2. ctx.register(WebConfig.class);
  3. ctx.setServletContext(servletContext);

我们创建一个AnnotationConfigWebApplicationContext并向register()注册一个 Web 配置文件。 我们将应用上下文与 Servlet 上下文绑定。

  1. var servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));
  2. servlet.setLoadOnStartup(1);
  3. servlet.addMapping("/");

在这里,我们注册一个 Spring DispatcherServlet,它是 Spring Web 应用的前端控制器。

com/zetcode/config/WebConfig.java

  1. package com.zetcode.config;
  2. import org.springframework.context.annotation.ComponentScan;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.web.servlet.config.annotation.EnableWebMvc;
  5. @Configuration
  6. @EnableWebMvc
  7. @ComponentScan(basePackages = "com.zetcode")
  8. public class WebConfig {
  9. }

WebConfig通过@EnableWebMvc启用 Spring MVC 注解,并为com.zetcode包配置组件扫描。

com/zetcode/controller/MyController.java

  1. package com.zetcode.controller;
  2. import org.springframework.http.MediaType;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. @RestController
  6. public class MyController {
  7. @GetMapping(value = "/", produces = MediaType.TEXT_PLAIN_VALUE)
  8. public String home() {
  9. return "This is home page";
  10. }
  11. }

MyController是一种 RESTful 控制器,具有一个映射。

  1. $ curl localhost:8080
  2. This is home page

我们使用curl工具连接到主页。

在本教程中,我们使用WebApplicationInitializer创建了一个简单的 Spring Web 应用。

您可能也对这些相关教程感兴趣: Spring @GetMapping教程Spring DefaultServlet教程Spring Web 应用简介Java 教程