`
Fangrn
  • 浏览: 818508 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring2.0的的新特性

    博客分类:
  • j2ee
阅读更多

前几天被某公司“邀请”过去面试了一下,期中问及了一个简单的 spring2 和spring1 之间的区别,本来是作为j2ee程序员应该很了解这个的,可我却蒙了,spring2用过很多,1.0的却很少用过,出糗了,呵呵。今天回过头来还是查资料吧。

 

现在市面上很早就有介绍 Spring2.0的书籍,稍微谈一下Spring2.0的一些新特性好了。
  1.引入基于Xml-Schema的配置语法,简化了Xml的配置
  2.引入新的Bean作用域(request和session范围)
  3.可扩展的容器级Xml配置(Spring官方文档将这个功能上升到了DSL级别)
  4.AOP有了很大改进,更无缝地整合了AspectJ,为管理Spring容器外的对象提供了可能
  5.JdbcTemplate的改进(增加了NamedParameterJdbcTemplate和SimpleJdbcTemplate)
  6.更简单的事务配置
  7.Spring Web MVC的大幅改进和增强(引入了CoC的观点和增强了的标签库)
  8.Spring的Scheduling支持引入TaskExecutor抽象
  9.支持JPA,支持异步JMS,更好的JMX支持
  10.支持动态语言,JRuby,Groovy,BeanShell

  就以上10大特性,接着分别展开介绍:
  1.引入基于Xml-Schema的配置语法,简化了Xml的配置
  在Spring1.x中,bean的xml配置采用xml-dtd的方式,2.x引入了xml-schema的方式(当然也完全支持先前的方式),这一引入大大简化了bean的xml配置烦琐程度。Spring容器提供了许多公用特性的namespace (xml-schema的概念)定义方法,随便举几个例子:
  a.定义集合:
    Spring 1.x Style:
    <bean id="emailList" class="org.springframework.beans.factory.config.ListFactoryBean">
      <property name="sourceList">
        <list>
          <value>aa@hotmail.com</value>
          <value>bb@hotmail.com</value>
        </list>
      </property>
    </bean>
    Spring 2.x Style:
    <util:list id="emailList">
      <value>aa@hotmail.com</value>
      <value>bb@hotmail.com</value>
    </util:list>
  b.定义JNDI获取:
    Spring 1.x Style:
    <bean id="jndiBean" class="org.springframework.jndi.JndiObjectFactoryBean">
      <property name="jndiName" value="jdbc/MyDataSource"/>
    </bean>
    Spring 2.x Style:
    <jee:jndi-lookup id="jndiBean" jndi-name="jdbc/MyDataSource"/>
  2. 引入新的Bean作用域(request和session范围)
  可以记得,在Spring1.x中,bean只有singleton和prototype两种作用域,并且是通过singleton开关来控制的。而 2.x则引入了更多的作用域,并且其语法也发生了变化,在2.x中使用了scope元素来定义bean的作用域,从而废弃了singleton开关。当然 如果你希望使用之前的定义方法也完全可以,只是你必需使用Spring1.x的DTD。如下:
  Spring 1.x Style:
    <bean id="logingAction" class="demo.LoginAction" singleton="true"/>
  Spring 2.x Style:
    <bean id="logingAction" class="demo.LoginAction" scope="request(session|singleton..)"/>
  关于这两个新引入的作用域背后,其实还有蛮多的学问,Spring官方文档就这个议题的DI(Dependency Injection)有一段比较详尽的描述,在此归纳一下:
  要向目标bean注射作用域为request或session的源bean,必须提供出源bean的代理(容器才足以智能地获取到
作用域为 request或session的真实bean对象),像下面这样:
  <!--源bean-->
  <bean id="userRef" class="demo.User" scope="session">
    <!--提供出源bean的代理-->
    <aop:scoped-proxy/>
  </bean>
  <!--目标bean-->
  <bean id="userManager" class="demo.UserManager" scope="singleton">
    <!--向目标bean注射源bean的代理-->
    <property name="userRef" ref="userRef"/>
  </bean>
  如果不提供出代理,则每次会获取到首次容器初始化的bean实例,这是不正确的,详见Spring官方文档。
  3.可扩展的容器级Xml配置(Spring官方文档将这个功能上升到了DSL级别)
  根据我的理解,使用了容器级这个修饰词,那么什么是容器级xml配置,简单来说就是Spring2.0提供出了一种手段,可通过Xml等手段来扩展容器的 功能。比如我可以书写一些Xml定义一些规则,然后插入容器中,当需要使用这些规则的时候,就可以简单地像通过使用容器默认提供的特性一样使用这些规则, 以xml-schema的形式。比如:<hello:say content="I am Spirit.J"/>,显然<hello:say>是我自己定义的一套规则,而不是容器预定义的。这样看来,按照官方为Spring 贴金的说法,真的是有点DSL(Domain Specific Language)的味道, 有点寒了,不过如果让我来贴金的话,我认为还是DSC比较妥当(Domain Specific Container),毕竟Spring还没有上升到语言到高度。详见Spring官方文档
  4.AOP有了很大改进,更无缝地整合了AspectJ,为管理Spring容器外的对象提供了可能
  AOP一向是Spring的一大特色和亮点,Spring2.x带来了全新的AOP feature,最大的改进是更加无缝地提供了对AspectJ的整合。<<精通Spring-Java轻量级架构开发实践>> 一书中,我曾在第三章详细介绍了AOP的概念以及AspectJ的开发,并在第六章花了很多笔墨介绍Spring AOP。如果有些朋友不能很快入手Spring2.x的AOP,我建议可先阅读这本书。
  如果没有Spring2.x的AspectJ支持,显然就需要通过AspectJ
特定的编译器,以完成AOP功能的织入。比如在Eclipse中,如果没有AJDT插件,就不能编译使用AspectJ。而Spring2.x的到来,改变了这一状况,于是现在我们多了很多选择,可以使用 AspectJ;可以通过@AspectJ(Spring2.x支持,需要 JDK5以上的Annotation );可以使用Schema-base AOP(Spring2.x支持);也 可 以依然使用'朴素'的Spring AOP API和早先的AOP Xml配置;稍微提一下@AspectJ的一个额外功能,现在Spring2.x可以通过@AspectJ来管理Spring容器外的任何对象了,比如 EJB,Servlet,POJO等等,这也是Spring官方推荐的管理容器外对象的方法。想了一下,这个功能实在是影响深远,更细致的介绍可以参考Spring官方文档。
  5.JdbcTemplate的改进(增加了NamedParameterJdbcTemplate等)
  还记得JdbcTemplate的易用吗?很快,Spring2.x又新增了几个JdbcTemplate以及相关的辅助 类,NamedParameterJdbcTemplate允许通过Map的名值对形式来定义Sql语句的参数了,这就使得我们可不仅仅受限于传统 JDBC以"?"带入Sql参数的方式了, NamedParameterJdbcTemplate不仅允许直接使用Java.util.Map,还提供了一个简单的Map包装类MapSqlParameterSource,为动态构造Sql条件提供了捷径。比如:
  public int getUserCount(final String user) {
    String sql = "select count(*) from user
                  where firstname = :first_name
                    and lastname = :last_name";

    NamedParameterJdbcTemplate tempate = new NamedParameterJdbcTemplate(this.getDataSource());
    SqlParameterSource params = new MapSqlParameterSource ();
    params.addValue("first_name", user.getFirstName());
    params.addValue("last_name", user.getLastName());

    return tempate.quertForInt(sql, params);
  }
此外,
SqlParameterSource接口还提供了一个实现:BeanPropertySqlParameterSource,它可根据JavaBean的属性来填充Sql条件的占位符,怎么看,这些个玩意儿都有点Ibatis的味道。
  6.更简单的事务配置
  可声明的事务配置,Spring的又一个亮点。籍由Spring2.x对AOP语法的改进以及AspectJ的整合,在Spring中声明事务不仅得到了简化,同时也变得更为强大。下面PetStore的例子一目了然:
  Spring 1.x Style:
  <bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
      abstract="true">
    <property name="transactionManager" ref="transactionManager"/>
    <property name="transactionAttributes">
      <props>
        <prop key="insert*">PROPAGATION_REQUIRED</prop>
        <prop key="update*">PROPAGATION_REQUIRED</prop>
        <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
      </props>
    </property>
  </bean>
  <bean id="petStore" parent="baseTransactionProxy">
    <property name="target">
      <bean class="org.springframework.samples.jpetstore.domain.logic.PetStoreImpl">
        ...
      </bean>
    </property>
  </bean>
  Spring 2.x Style:
  <bean id="petStore" class="org.springframework.samples.jpetstore.domain.logic.PetStoreImpl">
    ...
  </bean>
  <aop:config>
    <aop:advisor pointcut="execution(* *..PetStoreFacade.*(..))" advice-ref="txAdvice"/>
  </aop:config>
  <tx:advice id="txAdvice">
    <tx:attributes>
      <tx:method name="insert*"/>
      <tx:method name="update*"/>
      <tx:method name="*" read-only="true"/>
    </tx:attributes>
  </tx:advice>
  7.Spring Web MVC的大幅改进和增强(引入了CoC的观点和增强了的标签库)
  Spring2.x中,Web部分尤其是Spring MVC得到了长足的改进,不仅新增了很多JSP标签库(可参考spring-form.tld),而且对CoC(Convention Over Configuration)的观点提供了明确支持。所谓CoC,即通过一定的组件命名规约,可减少配置和编码的数量,从而带来开发效率的上升,不过这个 偏编程美学的东西这里就不予介绍了,可详细参考Spring的官方文档。
  8.Spring的Scheduling支持引入TaskExecutor抽象
  还记得在Spring1.x中,通过使用Spring对Scheduling的支持觉得挺过瘾的,客户端编程和配置都非常方便。然而看了Spring2.x的发布包之后,发现1.x的支持实在少得可怜(有点像玩具包了,仅仅是JDK的Timer以及OpenSymphony的Quartz而已)。原来Spring2.x对Scheduling功能强化了很多,无论如何 Scheduling背后总有Multi Thread的概念,有了Multi Thread,自然而然会有 ThreadPool的实现。 引入TaskExecutor抽象,根据Spring官方的说明, 主要是为了摆脱对Java5的java.util.concurrent.Executor( 即Java5的ThreadPool实现 )的依赖。好了,现在 由于 Spring2.x背后的 Scheduling Infrastructure足够抽象,为其注入不同的Muti Thread实现方式或者ThreadPool实现都成为了可能,而不需要绑定在某几种实现上,可以使用Spring自己提供的ThreadPool;可 以使用第三方提供的开源解决方案比如Quartz的ThreadPool;也可以使用由商业Application Server提供的更成熟的Thread Pool,Spring2.x目前提供了BEA和IBM都支持的CommonJ WorkManager,因此引入 TaskExecutor抽象 是个出色的改进。
  9.支持JPA,支持异步JMS,更好的JMX支持
  Spring2.x开始支持JPA(Java Persistent API),又一个持久层解决方案。在Spring2.x之前,只支持JMS的发送消息和同步接收消息,2.x开始支持异步接收消息了。Spring2.x 开始支持JMX的Notification模型,开始支持声明式的控制MBean向MBeanServer的注册(不明白JMX的朋友可以参考 <<精通Spring-Java轻量级架构开发实践>>一书 )。详细内容请参考Spring官方文档。
  10.支持动态语言,JRuby,Groovy,BeanShell
  Spring2.x开始支持动态语言了,这充分表明了Spring集大成,集最新流行技术的一贯态度和野心。首先稍微讲讲静态动态语言的概念,简单来说静 态语言大致在编译期决定行为,参数变量需要事先声明类型,并且一经声明不可改变,Java,C#,C++都是静态语言;而动态语言则在程序运行期决定行 为,参数变量一般无需事先声明类型,也可随意改变,甚至无需编译,因此脚本化、代码量少、开发效率高是动态语言的一些特征,现在火到不行的RoR,还有这 里讲的三种语言都是动态语言的范畴。静动态语言优劣这里不介绍了。
  Spring2.x充分肯定了动态语言的优势,另外给出了一个功能我非常感兴趣,Spring2.0系列已经可以通过动态脚本来配置Spring MVC Controller和Validator了,这就意味着Spring的xml配置在将来可以更多地实施动态脚本控制。Spring官方对这个 feature的命名是"dynamic-language-backed bean",详细内容可参考Spring官方文档。

分享到:
评论

相关推荐

    eclipse for Spring2.0新3

    《Eclipse for Spring 2.0 新特性解析与实践指南》 在软件开发领域,Spring框架作为Java EE应用中的核心框架之一,深受开发者喜爱。Eclipse for Spring是Eclipse IDE针对Spring框架定制的一个插件,它极大地提升了...

    spring2.0技术手册--林信良

    《Spring 2.0 技术手册》是继 Spring 1.0 之后的重要著作,作者林信良针对 Spring 框架在 2.0 版本中的新特性进行了深入剖析与讲解。本书不仅适合于已经有一定 Java 开发基础的学习者,也适用于想要深入了解 Spring ...

    Spring2.0宝典源代码

    这份源代码集合是配合书籍《Spring2.0宝典》使用的,读者可以通过实际操作代码来理解和掌握Spring 2.0的核心特性和应用场景。光盘中包含的“codes”文件夹,极有可能包含了书中各个章节的示例代码,覆盖了Spring 2.0...

    eclipse for Spring2.0新2

    《Eclipse for Spring 2.0 新特性详解》 Eclipse for Spring 2.0 是一个专门为Spring框架提供集成开发环境(IDE)的扩展,它极大地提升了开发人员在使用Spring框架时的效率和便利性。这个版本带来了诸多新功能和...

    spring2.0中文手册及使用指南 chm

    本手册和使用指南提供了全面的Spring 2.0相关知识,包括其核心特性、配置方式以及如何在实际项目中应用。 首先,让我们深入了解一下Spring框架的核心概念。Spring的依赖注入(Dependency Injection,简称DI)是一种...

    SPRING2.0中文文档

    总结,这份中文版的Spring 2.0技术文档全面覆盖了Spring框架的主要特性和使用方法,是开发者深入学习和掌握Spring 2.0不可或缺的工具。通过阅读和实践文档中的示例,开发者可以更好地理解如何利用Spring 2.0解决实际...

    Spring2.0中文教程

    Spring 2.0是Spring框架的一个重要版本,它在Java企业级应用开发中扮演着核心角色。本教程将深入探讨...文档`spring2.0-reference_final_zh_cn.chm`将详细阐述这些概念和技术,帮助你成为一名熟练的Spring开发者。

    spring2.0 jar包

    Spring框架是Java开发中不可或...总结,Spring 2.0是一个功能强大且成熟的框架,其依赖注入、AOP、Web MVC等特性使得Java企业级应用开发变得更加高效和灵活。了解并熟练掌握这些知识点,对于提升Java开发能力至关重要。

    SPRING2.0开发详解

    ### SPRING2.0开发详解 #### 一、Spring框架简介 Spring框架是一个开源的Java平台,用于构建企业级应用程序和服务。它最初由Rod Johnson在2004年创建,并随着时间的发展不断壮大和完善。Spring 2.0版本是Spring...

    spring2.0 中文教程

    在Spring 2.0版本中,引入了许多重要的改进和新特性,使得开发者能够更加高效地进行开发工作。以下是对Spring 2.0的一些关键知识点的详细解释: 1. **依赖注入 (Dependency Injection, DI)**:Spring 2.0继续强化了...

    spring2.0中文参考手册.rar

    《Spring 2.0 中文参考手册》是一个详尽阐述 Spring 框架核心特性和扩展功能的重要资源,尤其对于中文开发者来说,它提供了一条理解 Spring 2.0 版本的关键途径。Spring 是一个广泛应用的 Java 开发框架,以其模块化...

    Spring2.0技术手册

    本书介绍了Spring 2.0的新特性,诸如Spring 2.0的新配置、新AOP支持、增强的IoC、JDBC和form标签等新功能。它通过实际完成一个完整的Spring项目示例,展示了与Spring相关API的使用技巧,能够显著减少每一位入门者...

    Spring 2.0 源代码

    这个版本引入了许多新特性,增强了框架的功能和灵活性。本文将深入探讨Spring 2.0源代码中的关键知识点,帮助开发者理解其内部机制。 1. **依赖注入(Dependency Injection, DI)**:Spring 2.0进一步完善了依赖注入...

    Spring2.0技术手册(林信良)_part2

    本书介绍了Spring 2.0的新特性,诸如Spring 2.0的新配置、新AOP支持、增强的IoC、JDBC和form标签等新功能。它通过实际完成一个完整的Spring项目示例,展示了与Spring相关API的使用技巧,能够显著减少每一位入门者...

    spring2.0技术手册.pdf

    Spring 2.0 技术手册是学习 Spring 2.0 的重要参考资料之一,它不仅详细介绍了 Spring 2.0 的各项特性和新增功能,还提供了大量的示例代码和最佳实践指导。对于想要深入了解 Spring 框架及其在企业级应用中作用的...

    spring2.0技术手册_源代码(全十章)

    首先,Spring 2.0是一个重要的版本升级,引入了许多新特性和改进,旨在提高开发效率和应用的可测试性。其中,最重要的更新之一是支持JSR-250的`@ManagedBean`和`@PostConstruct`注解,使得bean的管理更加简洁。在源...

    Spring2.0技术手册_林信良PDF

    总的来说,《Spring2.0技术手册_林信良》是一本全面而深入的教程,涵盖了Spring 2.0的主要特性和用法。通过阅读本书,开发者不仅可以学习到Spring的基础知识,还能了解到如何在实际项目中有效地运用Spring框架,提升...

    详尽的Spring2.0学习提纲

    2. 高级特性实践:探索Spring Security、Spring WebSocket、Spring Boot等进阶主题,提升项目开发能力。 通过以上学习,你可以全面掌握Spring 2.0的核心技术和应用,为成为熟练的Spring开发者奠定坚实的基础。在...

Global site tag (gtag.js) - Google Analytics