作者: Eugen Paraschiv
译者: helloworldtang
1. 概览
本教程讲述了如何使用Spring引导Web应用程序,并讨论了如何从XML配置转换成Java配置,而不必完全迁移整个XML配置。
2. Maven pom.xml
代码语言:javascript复制<project xmlns=...>
<modelVersion>4.0.0</modelVersion>
<groupId>org</groupId>
<artifactId>rest</artifactId>
<version>0.1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
<exclusions>
<exclusion>
<artifactId>commons-logging</artifactId>
<groupId>commons-logging</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<finalName>rest</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
</project>
3. 基于java的Web配置
代码语言:javascript复制@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "org.baeldung")
public class AppConfig{
}
首先来看看@Configuration 注解——这是Spring中使用Java配置时的主要组件; @Configuration是基于@Component元注解的,如果一个类上添加了这个元注解,Spring容器会在启动时将其初始化为标准bean。
@Configuration类主要是用来配置Spring IoC容器bean定义的。更详细的信息,请参阅 官方文档。
@EnableWebMvc支持@Controller和 @RequestMapping注解,并且被用来提供Spring Web MVC配置;它和下面的XML配置是等价的:
代码语言:javascript复制<mvc:annotation-driven />
@ComponentScan——这个注解用来配置组件扫描指令,可以有效替代下面的XML配置:
代码语言:javascript复制<context:component-scan base-package="org.baeldung" />
在Spring 3.1中,@Configuration在缺省情况下被排除在类路径扫描之外——参见这个 JIRA issue。然而,在spring3.1之前,这些类应该被显式地排除掉:
代码语言:javascript复制excludeFilters = { @ComponentScan.Filter( Configuration.class ) }
@Configuration类不应该被自动发现,因为它们已经被容器指定和使用——如果允许被重新发现并加载到Spring上下文,将报以下错误:
代码语言:javascript复制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
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns=...>
<context-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>org.baeldung</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>rest</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>org.baeldung.spring</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>rest</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file />
</welcome-file-list>
</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的项目,所以应该很容易导入和运行。