`
zzc1684
  • 浏览: 1213499 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

译:使用Spring3.1和基于Java的配置启动web应用 part 1

阅读更多

原文地址:http://www.baeldung.com/2011/10/20/bootstraping-a-web-application-with-spring-3-1-and-java-based-configuration-part-1/

 

这是使用Spring3.1创建RESTfull web应用系列文章的第一篇。这篇文章我们主要介绍启动一个web应用,并讨论怎样从XML转到Java而完全不需要使用XML配置文件。
Spring REST系列文章包括:
part 2-使用Spring3.1和基于Java的配置创建一个RESTful web service
part 3-使用Spring Security3.1创建安全的RESTful web service
part 4-RESTful web service的创新性
part 5-Spring REST Service的创新性

 

The mavne pom.xml文件:

<project xmlns="http://maven.apache.org/POM/4.0.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation=
   "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>org</groupId>
   <artifactId>rest</artifactId>
   <version>0.0.1-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>
      <dependency>
         <groupId>cglib</groupId>
         <artifactId>cglib-nodep</artifactId>
         <version>${cglib.version}</version>
         <scope>runtime</scope>
      </dependency>
      
   </dependencies>

   <build>
      <finalName>rest</finalName>
      
      <plugins>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
               <source>1.6</source>
               <target>1.6</target>
               <encoding>UTF-8</encoding>
            </configuration>
         </plugin>
      </plugins>
   </build>
   
   <properties>
      <spring.version>3.1.0.RELEASE</spring.version>
      <cglib.version>2.2.2</cglib.version>
   </properties>

</project>

 如果使用Spring3.2 milestones(目前还没有),需要增加下面的maven repository到pom.xml中

<repository>
   <id>org.springframework.maven.milestone</id>
   <name>Maven Central Compatible Spring Milestone Repository</name>
   <url>http://maven.springframework.org/milestone</url>
   <snapshots>
      <enabled>false</enabled>
   </snapshots>
</repository>

 

cglib依赖的理由

你想知道为什么需要cglib依赖-结果是有一个合理的理由包含这个依赖-如果不包含cglib依赖整个配置文件不会生效。如果去掉这个依赖,Spring会抛出:

写道
Caused by: java.lang.IllegalStateException: CGLIB is required to process @Configuration classes. Either add CGLIB to the classpath or remove the following @Configuration bean definitions

 抛出这个错误的原因是Spring处理@Configuration注解类的方式。这些类是一些有效地beans,正因为如此,他们需要上下文和 生命周期以及其它的bean语义,这些可通过为每一个@Configuration动态创建一个cglib代理来获得,因此cglib不可缺少。

另外,也正因为如此,configuration注解类有一些限制:

  • configuration注解类不能为final
  • 有一个没有参数的构造函数

基于Java的web配置:

    @Configuration  
    @ImportResource( { "classpath*:/rest_config.xml" } )  
    @ComponentScan( basePackages = "org.rest" )  
    public class AppConfig{  
         
       @Bean  
       public static PropertyPlaceholderConfigurer properties(){  
          PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();  
          final Resource[] resources = new ClassPathResource[ ] {  
             new ClassPathResource( "persistence.properties" ),  
             new ClassPathResource( "restfull.properties" )  
          };  
          ppc.setLocations( resources );  
          ppc.setIgnoreUnresolvablePlaceholders( true );  
          return ppc;  
       }  
         
    }  

   首先,@Configuration注解-基于java的Spring配置使用的主要构件;它自身是@Component注解的元注解,让带注解的类成为 一个标准的bean,也支持组件扫描。@Configuration类的主要目的是成为Spring IoC容器注入定义备案的来源。更多的细节描述,请参考官方文档。

然后,@ImportResource注解用于导入已存在的基于XML的Spring配置文件。这个注解可以把XML配置文件迁移到Java,或者只要你 愿意可以简化遗留的配置文件。总之,把它导入到容器,对成功迁移来说是非常重要的,只需小的代价,而且不必冒风险。可以用下面的XML来代替注解:

<import resource=”classpath*:/rest_config.xml” />

 再看看@ComponentScan-这个配置组件扫描指令,可以用下面的XML代替:

<context:component-scan base-package=”org.rest” />

 自Spring3.1 RC2版本起,@Configuration注解默认是排除路径扫描的——可以参考 this JIRA issue 。在Spring3.1之前,这些被排除的类应该显示地指明:

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

 带Configuration注解的类不应该被自动发现,因为他们已经被指定,并且被容器使用——允许他们被发现和被Spring上下文引入将会导致下面错误:

写道
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]

最后使用@Bean注解来配置properties支持——PropertyPlaceholderConfigurer通过@Bean的注解方法来初始化,指明她讲产生一个Spring容器管理的bean。这个新注解
可以用下面的XML代替:

<context:property-placeholder
location=”classpath:persistence.properties, classpath:restfull.properties”
ignore-unresolvable=”true”/>

 web.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id="WebApp_ID" version="3.0">
   <display-name>rest</display-name>
   
   <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.rest.spring.root</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.rest.spring.rest</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>

 

 首先,root上下文定义和配置使用AnnotationConfigWebApplicationContext来代替默认的 XmlWebApplicationContext。这个新的AnnotationConfigWebApplicationContext接受
@Configuration注解的类作为容器配置文件的输入并且是设置基于java的上下文必不可少的。

不像XmlWebApplicationContext,她假设没有默认的配置文件类的位置,因此servlet必须要设置contextConfigLocation,它指出@Configuration注解类所在Java包的位置,也支持这个类的全名。
接下来,配置使用同样的方式配置DispatcherServlet ,唯一不同的地方是加载配置文件的类时不同的Java包。
除此之外,web.xml不是真正的从XML转到了基于Java的配置。
结论
已提出的方法允许Spring配置文件从XML到Java的顺利迁移,混合旧的和新的方法。有很多旧的基于XML配置的工程不能一次全部迁移,这对于旧工程来说非常重要。
web.xml和启动web应用是迁移的第一步,余下的XML beans将逐步介绍。
在 part2部分,我将涉及Spring MVC配置,HTTP状态码得配置,负荷组装和内容协商。同时,你可以从github project 检出工程。

 

分享到:
评论

相关推荐

    spring part 3.1

    总的来说,"spring part 3.1"可能涉及了Spring框架3.0.1版本中的Spring Data模块,包括其核心概念、使用方法、示例和配置,是学习和使用Spring Data的一个重要资源。开发者可以通过解压文件并阅读其中的内容,深入...

    Spring.3.x企业应用开发实战(完整版).part2

    13.6.4 Web应用程序中调度器的启动和关闭问题 13.7 小结 第14章 使用OXM进行对象XML映射 14.1 认识XML解析技术 14.1.1 什么是XML 14.1.2 XML的处理技术 14.2 XML处理利器:XStream 14.2.1 XStream概述 14.2.2 快速...

    Spring3.x企业应用开发实战(完整版) part1

    13.6.4 Web应用程序中调度器的启动和关闭问题 13.7 小结 第14章 使用OXM进行对象XML映射 14.1 认识XML解析技术 14.1.1 什么是XML 14.1.2 XML的处理技术 14.2 XML处理利器:XStream 14.2.1 XStream概述 14.2.2 快速...

    精通spring(part 4)共分5个part (罗时飞)

    Spring MVC是Spring框架的一个模块,用于构建Web应用。它遵循MVC(Model-View-Controller)设计模式,将业务逻辑、数据和用户界面分离。 #### 3.2 Spring MVC的工作流程 1. 用户向服务器发送请求。 2. ...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    主要包括Java Web开发环境、JSP语法、JSP内置对象、Java Bean技术、Servlet技术、EL与JSTL标签库、数据库应用开发、初识Struts2基础、揭密Struts2高级技术、Hib锄劬e技术入门、Hibernate高级应用、Spring核心之IoC、...

    Spring Framework 中文

    - **1.2.3 Web(Web)**:提供了创建基于Spring的Web应用程序所需的所有支持,如MVC框架。 - **1.2.4 AOP和仪表(AOP and Instrumentation)**:提供了面向切面编程的能力,以及在容器中进行代理和类加载机制的配置。 - ...

    Spring in Action(第二版 中文高清版).part2

    第8章 Spring和基于POJO的远程服务 8.1 Spring远程调用概览 8.2 与RMI一起工作 8.2.1 连接RMI服务 8.2.2 输出RMI服务 8.3 使用Hessian和Burlap的远程调用 8.3.1 访问Hessian/Burlap服务 8.3.2 用Hessian或...

    Spring in Action(第二版 中文高清版).part1

    第8章 Spring和基于POJO的远程服务 8.1 Spring远程调用概览 8.2 与RMI一起工作 8.2.1 连接RMI服务 8.2.2 输出RMI服务 8.3 使用Hessian和Burlap的远程调用 8.3.1 访问Hessian/Burlap服务 8.3.2 用Hessian或...

    Spring-Reference_zh_CN(Spring中文参考手册)

    6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. 其它资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点实施 7.2.3. AspectJ切入点表达式 7.2.4. 便利的切入...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。 《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础讲起,从而...

    精通spring(part 3)共分5个part (罗时飞)

    通过上述内容的详细介绍,《精通Spring》这本书不仅涵盖了Spring框架的基础知识,还深入讲解了其高级应用和技术栈的扩展,非常适合希望深入了解Spring框架及其在Java 2EE平台上应用的开发者阅读。

    Spring3.2中文版.docx

    14. **基于Servlet的配置**:对于Servlet 3.0容器,可以使用Java代码来配置Spring MVC,使得配置更为简洁。 15. **MultipartResolver支持**:处理上传文件的支持,使得文件上传功能更容易实现。 16. **IoC容器**:...

    Spring中文帮助文档

    6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点运算 7.2.3. AspectJ切入点表达式 7.2.4. 便利的切入...

    Spring攻略(第二版 中文高清版).part1

    10.6 使用BlazeDS和Spring消费面向消息的服务 421 10.6.1 问题 421 10.6.2 解决方案 422 10.6.3 工作原理 422 10.7 将依赖注入带给你的ActionScript客户 434 10.7.1 问题 434 10.7.2 解决方案 434 ...

    精通spring(part 5)共分5个part (罗时飞)

    - Spring MVC是Spring框架的一个模块,用于构建基于模型-视图-控制器架构的Web应用程序。 - 它提供了一种简洁的方式处理HTTP请求,并能够轻松地与视图技术(如JSP、Thymeleaf等)集成。 #### 4.2 RESTful Web服务 -...

    Spring 2.0 开发参考手册

    6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. 其它资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点实施 7.2.3. AspectJ切入点表达式 7.2.4. ...

    Spring API

    6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点运算 7.2.3. AspectJ切入点表达式 7.2.4. 便利的切入...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。 《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础讲起,从而...

    servlet-3_1-final(中文版).doc

    2. **注解配置**:相比于之前的版本,Servlet 3.1更加强调使用注解进行配置,减少了web.xml文件的依赖。开发者可以直接在Servlet、Filter、Listener等组件上使用注解来声明和配置,简化了部署描述符的维护工作。 3....

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。 《JavaEE开发的颠覆者: Spring Boot实战》从Spring 基础、Spring MVC 基础讲起,从而...

Global site tag (gtag.js) - Google Analytics