Spring3.0的新特性及其分析

最近公司考虑将内部的服务层框架SCM进行升级,不仅支持原来的RMI远程调用机制,而且支持Hessian等多协议的远程调用。于是让我研究一下 
Spring3.0有哪些新特性,考虑是否有必要将Spring顺便升级到3.0。翻了下Spring3.0的官方参考文档,总结的新特性如下: 


一、Spring3.0以后不再提供一个大的完整的jar包,而是分成20个小的jar包: 

  • org.springframework.aop, 包含在应用中使用Spring的AOP特性时所需的类。

  • org.springframework.asm,Spring独立的asm程序,Spring2.5.6的时候需要  asm.jar 包,3.0开始提供自己独立的asm.jar

  • org.springframework.aspects,提供对AspectJ的支持,以方便的将面向切面的功能集成进IDE中,比如Eclipse AJDT.

  • org.springframework.beans,所有应用都要用到,它包含访问配置文件,创建和管理Bean以及进行反转共控制和依赖注入操作时所需的类

  • org.springframework.context,为 Spring 核心提供了大量扩展。可以找到使用Spring ApplicationContext 特性时所需的全部类,JDNI所需的全部类,UI方面的用来与模板(Templating)引擎如 Velocity、 FreeMarker、 JasperReports 集成的类, 以及校验 Validation 方面的相关类。

  • org.springframework.context.support,包含支持缓存Cache(ehcache)JCA、JMX、邮件服务(Java Mail、Mail)COS、任务计划Scheduling(Timer、Quartz)方面的类。

  • org.springframework.core,包含 Spring 框架基本的核心工具类,Spring 其它组件要都要使用到这个包里的 类,是其它组件的基本核心。

  • org.springframework.expression,包含Spring 表达式语言相关的类,应用使用到SpEL时需要添加这个jar包。

  • org.springframework.instrument.tomcat,Spring3.0对Tomcat的连接池的集成

  • org.springframework.instrument,Spring3.0 对服务器的代理接口。

  • org.springframework.jdbc,包含对 Spring 对 JDBC 数据访问进行封装的所有类。

  • org.springframework.jms,提供了对JMS1.0.2/1.1 的支持类。

  • org.springframework.orm,包含Spring对DAO特性集进行了扩展,使其支持iBATIS、JDO、OJB、TopLink,因为Hibernate已经独立成包了,现在不包含在这个包里了。这个jar文件里大部分的类都要依赖spring-dao.jar里的类,用这个包时你需要同时包含 spring-dao.jar包。 

  • org.springframework.oxm,Spring 对 Object/XMl 的映射支持,可以让Java与XML之间来回切换。

  • org.springframework.test,对Junit等测试框架的简单封装。

  • org.springframework.transaction,为JDBC、Hibernate、JDO、JPA等提供的一致的声明式和编程式事务管理。

  • org.springframework.web,包含Web应用开发时,用到Spring框架时所需的核心类,包括自动载入WebApplicationContext特性的类、Struts与JSF集成类、文件上传的支持类、Filter类和大量工具辅助类。

  • org.springframework.web.portlet,对SpringMVC的增强,包含SpringMVC相关的类

  • org.springframework.web.servlet,对J2EE6.0的Servlet3.0的支持。

  • org.springframework.web.struts,对Struts框架支持,可以更方便更容易的集成Struts框架。


Spring的构建系统以及依赖管理使用的是Apache Ivy。 

二、 增加的新特性: 

     1、 Spring Expression Language (Spring表达式语言) 

     2、 IoC enhancements/Java based bean metadata (增强的IOC,基于java的Bean元数据)  

     3、 General-purpose type conversion system and field formatting system (通用类型转换系统和字段格式化系统) 

     4、 Object to XML mapping functionality (OXM) moved from Spring Web Services project (对象和XML之间的映射,来自于Srping Web Services项目) 

     5、 Comprehensive REST support (广泛的REST支持) 

     6、 @MVC  additions (Spring的MVC注解增强) 


     7、 Declarative model validation (声明试模型验证) 

     8、 Early support for Java EE 6 (提前对JEE6的支持) 

     9、 Embedded database support (嵌入式数据库的支持) 


     关于新特性,下面会有详细说明。 

三、 API更新: 

     1、 BeanFactory接口尽可能的返回明确的实例,例如: 

           T getBean(Class<T> requiredType) 

           T getBean(String name, Class<T> requiredType) 

           Map<String, T> getBeansOfType(Class<T> type) 

           这样我们在通过容器获取bean时就可以使用泛型,而不必进行强制转化,另外一个方面又可以根据bean的类型来获取Bean的实例。 

      2、 Spring的TaskExecutor现在继承java.util.concurrent.Executor接口。 

           扩展的子接口 AsyncTaskExecutor 支持标准的具有返回结果 Futures 的 Callables. 

      3、 新的基于 Java5 的 API 和 SPI 转换器 

            无状态的 ConversionService 和 Converters 

            取代标准的 JDK PropertyEditors 

      4、 类型化的 ApplicationListener<E>, 

            这是一个实现"观察者设计模式"使用的事件监听器. 基于事件的编程模式, 好处多多, 在项目中应该考虑使用, 基于事件,状态迁移的设计思路, 有助于理清软件流程,和减少项目的耦合度. 

四、 Spring Expression Language (Spring 表达式语言,简称SpEL) 

         Spring3.0引入了一种新的表达式语言:SpEL. SpEL使得java具有动态语言的风格,可以在运行时获取表达式的值。依赖注入时可以使用SpEL表达式语言, 不再只是原来简单的属性文件变量。xml配置 

         文件和java注解都支持SpEL,eg: 

         配置文件:

Xml代码  收藏代码

  1. <bean class="mycompany.RewardsTestDatabase">  

  2. <property name="databaseName" value="#{systemProperties.databaseName}"/>  

  3.        <property name="keyGenerator" value="#         

  4.                            {strategyBean.databaseKeyGenerator}"/>  

  5. </bean>  



        注解: 

Java代码  收藏代码

  1. @Repository  

  2. public class RewardsTestDatabase {  

  3.   

  4.        @Value ("#{systemProperties.databaseName}")  

  5.        public void setDatabaseName(String dbName){ … }  

  6.   

  7.        @Value ("#{strategyBean.databaseKeyGenerator}")  

  8.        public void setKeyGenerator(KeyGenerator kg) { … }  

  9.   

  10. }  



五、 IoC enhancements/Java based bean metadata(增强的IOC,基于java的bean配置) 

          增强的IOC,配置Bean时除了原来的XML和Annotation,现在支持一种java类和元数据结合的配置方式。新增注解: 

           @Configuration、@Bean、@DependsOn、@Primary、@Lazy、@Import、@ImportResource、@Value。eg: 

           java类配置文件: 

Java代码  收藏代码

package org.example.config;  
  
@Configuration  
public class AppConfig {  
  
        private @Value("#{jdbcProperties.url}") String jdbcUrl;  
        private @Value("#{jdbcProperties.username}") String username;  
    private @Value("#{jdbcProperties.password}") String password;  
  
    @Bean  
    public FooService fooService() {  
        return new FooServiceImpl(fooRepository());  
    }  
    @Bean  
    public FooRepository fooRepository() {  
        return new HibernateFooRepository(sessionFactory());  
    }  
    @Bean  
    public SessionFactory sessionFactory() {  
        // wire up a session factory  
        AnnotationSessionFactoryBean asFactoryBean = new AnnotationSessionFactoryBean();  
        asFactoryBean.setDataSource(dataSource());  
        // additional config  
        return asFactoryBean.getObject();  
    }  
    @Bean  
    public DataSource dataSource() {  
        return new DriverManagerDataSource(jdbcUrl, username, password);  
    }  
}
             为了让这段代码开始生效,我们需要添加如下组件应用程序上下文配置文件中, 

         xml配置文件: 

Xml代码  收藏代码

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

  2. <util:properties id="jdbcProperties" location="classpath:org/example/config/jdbc.properties"/>  



         xml配置文件主要用于指定java类配置文件和引用到的属性文件的位置。这个文件是可选的,当时使用原来的ClassPathXMLApplicationContext等获取BeanFactory时, 

         这个文件是必须的。或者直接使用AnnotationConfigApplicationContext时,该文件可不要。eg: 

Java代码  收藏代码

  1. ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);  
    FooService fooService = ctx.getBean(FooService.class);



六、 General-purpose type conversion system and field formatting system 

         Spring3.0加入了一个通用的类型转换系统,目前它被SpEL用作类型转换,并且可能被一个Spring容器使用,用于当绑定bean的属性值的时候进行类型转换另外, 

         还增加了一个字段格式化系统,它提供了更简单的使用并且强大的功能以替代UI环境下的Javabean的PropertyEidtors,例如在SpringMVC中。  

七、 Object to XML mapping functionality (OXM) moved from Spring Web Services project 

         对象到XML之间的映射功能原来是在Spring Web services project项目中的,现在已经迁移到Spring框架的核心中,位于org.springframework.oxm中。 

         提供JAXB,XmlBeans以及XStream等方式的实现。 

八、 Comprehensive REST support (增强的REST支持) 

        增强的REST支持。在web层的新特性是增加REST风格的web服务和web应用的支持,另外还新增了一些任何web应用都可以使用的新的注解。 

        服务端对于REST风格的支持,是通过扩展既有的注解驱动的MVC web 框架实现的. 

        客户端的支持则是 RestTemplate 类提供的,基于HttpClient. 

        无论服务端还是客户端REST功能,都是使用HttpConverter来简化对HTTP请求和应答过程中的对象到表现层的转换过程. 

         MarshallingHttpMessageConverter 使用了上面提到的"对象到 XML 的映射机制". 

、 @MVC additions (SpringMVC注解增强) 

        SpringMVC注解有所增强,新增了诸如@CookieValue 和 @RequestHeaders 这样的注解等. 

十、 Declarative model validation(声明试模型验证) 

        支持JSR303,使用Hibernate Validator 作为默认实现, eg: 

Java代码  收藏代码

  1. public class Person {  

  2.     @NotNull  

  3.     @Max(64)  

  4.     private String name;  

  5.   

  6.         @Min(0)  

  7.     private int age;  

  8. }  


十一、 Early support for Java EE 6(JEE6早期支持) 

            提前对JEE6的支持。提供了使用@Async注解对于异步方法调用的支持(或者EJB3.1里的@Asynchronous) 

            另外,新增对JSR303,JSF2.0,JPA2.0等的支持。 

十二、 Embedded database support(嵌入式数据库的支持) 


你可能感兴趣的:(Spring3.0的新特性及其分析)