如何从XML友好de迁移到Java Config

2023-03-07 16:20:26 浏览数 (1)

原文链接: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

代码语言: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的项目,所以应该很容易导入和运行。

0 人点赞