查看原文
其他

【SFA官方翻译】:使用Spring 5引导Web应用程序

The following article is from 生活点亮技术 Author JackieTang

原文链接:https://www.baeldung.com/bootstraping-a-web-application-with-spring-and-java-based-configuration

作者: Eugen Paraschiv

译者: helloworldtang

1. 概览

本教程说明了如何使用Spring引导Web应用程序,并讨论了如何从XML配置转换成Java配置,而不必完全迁移整个XML配置。

2. Maven pom.xml

  1. <project xmlns=...>

  2.   <modelVersion>4.0.0</modelVersion>

  3.   <groupId>org</groupId>

  4.   <artifactId>rest</artifactId>

  5.   <version>0.1.0-SNAPSHOT</version>

  6.   <packaging>war</packaging>

  7.   <dependencies>

  8.      <dependency>

  9.         <groupId>org.springframework</groupId>

  10.         <artifactId>spring-webmvc</artifactId>

  11.         <version>${spring.version}</version>

  12.         <exclusions>

  13.            <exclusion>

  14.               <artifactId>commons-logging</artifactId>

  15.               <groupId>commons-logging</groupId>

  16.            </exclusion>

  17.         </exclusions>

  18.      </dependency>

  19.   </dependencies>

  20.   <build>

  21.      <finalName>rest</finalName>

  22.      <plugins>

  23.         <plugin>

  24.            <groupId>org.apache.maven.plugins</groupId>

  25.            <artifactId>maven-compiler-plugin</artifactId>

  26.            <version>3.7.0</version>

  27.            <configuration>

  28.               <source>1.8</source>

  29.               <target>1.8</target>

  30.               <encoding>UTF-8</encoding>

  31.            </configuration>

  32.         </plugin>

  33.      </plugins>

  34.   </build>

  35.   <properties>

  36.      <spring.version>5.0.2.RELEASE</spring.version>

  37.   </properties>

  38. </project>

3. 基于java的Web配置

  1. @Configuration

  2. @EnableWebMvc

  3. @ComponentScan(basePackages = "org.baeldung")

  4. public class AppConfig{

  5. }

首先来看看@Configuration 注解——这是Spring中使用Java配置时的主要组件; @Configuration是基于@Component元注解的,如果一个类上添加了这个元注解,Spring容器会在启动时将其初始化为标准bean。

@Configuration类主要是用来配置Spring IoC容器bean定义的。更详细的信息,请参阅 官方文档。

@EnableWebMvc* 支持@Controller@RequestMapping*注解,被用来提供Spring Web MVC配置;它和下面的XML配置是等价的:

  1. <mvc:annotation-driven />

@ComponentScan——这个注解用来配置组件扫描指令,可以有效替代下面XML中的配置:

  1. <context:component-scan base-package="org.baeldung" />

在Spring 3.1中,@Configuration在缺省情况下被排除在类路径扫描之外——参见这个 JIRA issue。然而,在spring3.1之前,这些类应该被显式地排除掉:

  1. excludeFilters = { @ComponentScan.Filter( Configuration.class ) }

@Configuration类不应该被自动发现,因为它们已经被容器指定和使用——如果允许被重新发现并加载到Spring上下文将导致以下错误:

  1. Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name ‘webConfig’ for bean class [org.rest.spring.AppConfig] conflicts with existing, non-compatible bean definition of same name and class [org.rest.spring.AppConfig]

3.1. 部署描述文件web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <web-app xmlns=...>

  3.   <context-param>

  4.      <param-name>contextClass</param-name>

  5.      <param-value>

  6.         org.springframework.web.context.support.AnnotationConfigWebApplicationContext

  7.      </param-value>

  8.   </context-param>

  9.   <context-param>

  10.      <param-name>contextConfigLocation</param-name>

  11.      <param-value>org.baeldung</param-value>

  12.   </context-param>

  13.   <listener>

  14.      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

  15.   </listener>

  16.   <servlet>

  17.      <servlet-name>rest</servlet-name>

  18.      <servlet-class>

  19.         org.springframework.web.servlet.DispatcherServlet

  20.      </servlet-class>

  21.      <init-param>

  22.         <param-name>contextClass</param-name>

  23.         <param-value>

  24.            org.springframework.web.context.support.AnnotationConfigWebApplicationContext

  25.         </param-value>

  26.      </init-param>

  27.      <init-param>

  28.         <param-name>contextConfigLocation</param-name>

  29.         <param-value>org.baeldung.spring</param-value>

  30.      </init-param>

  31.      <load-on-startup>1</load-on-startup>

  32.   </servlet>

  33.   <servlet-mapping>

  34.      <servlet-name>rest</servlet-name>

  35.      <url-pattern>/api/*</url-pattern>

  36.   </servlet-mapping>

  37.   <welcome-file-list>

  38.      <welcome-file />

  39.   </welcome-file-list>

  40. </web-app>

首先,使用AnnotationConfigWebApplicationContext来定义和配置应用程序的上下文,而不是默认的XmlWebApplicationContext。新的注解 AnnotationConfigWebApplicationContext接受@Configuration 注解类作为容器配置的输入,为了使用基于Java配置的上下文,我们需要它。

XmlWebApplicationContext不同的是,AnnotationConfigWebApplicationContext假定没有默认的 contextConfigLocation,因此必须设置Servlet的“contextConfigLocation” init-param,配置的参数值为添加了@Configuration类所在的java包;也支持类的全限定名。

接下来,DispatcherServlet被配置为使用相同的上下文AnnotationConfigWebApplicationContext,惟一的区别是它将配置类从不同的包中加载。

除此之外,web.xml不会从XML变更为基于java的配置。

4. 总结

上面示例呈现的方法允许将Spring配置从XML平稳地迁移到Java,将旧的和新的混合在一起。这对于较老的项目来说很重要,因为它们可能有大量的基于XML的配置,不能同时迁移。

通过这种方式,在项目整体迁移过程中,可以将通过XML配置的bean以小步快走的方式迁移到基于Java的配置。

在下一篇关于Spring REST的文章中,将介绍在项目中配置MVC、HTTP状态码、有效载荷编排和内容协商。

与往常一样,本文中提供的代码可以在Github上找到。这是一个基于Maven的项目,所以应该很容易导入和运行。

推荐:【SFA官方翻译】:如何使用Spring优雅地处理REST异常

上一篇:分布式链路跟踪 Sleuth 与 Zipkin【Finchley 版】

关注公众号


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存